web-dev-qa-db-fra.com

Comment écrire un module / package Python?

Je fais des scripts Python pour des tâches simples au travail et je n'ai jamais pris la peine de les conditionner pour que d'autres les utilisent. J'ai maintenant été affecté à la création d'un wrapper Python pour une API REST. Je ne sais absolument pas comment commencer et j'ai besoin d'aide.

Ce que j'ai:

(Je veux juste être aussi précis que possible) J'ai le virtualenv prêt, il est aussi dans github , le fichier .gitignore pour python est là comme De plus, bibliothèque de requêtes pour interagir avec l'API REST. C'est ça.

Voici l'arborescence actuelle

.
├── bin
│   └── /the usual stuff/
├── include
│   └── /the usual stuff/
├── lib
│   └── python2.7
│       └── /the usual stuff/
├── local
│   └── /the usual stuff/
└── README.md

27 directories, 280 files

Je ne sais même pas où placer les fichiers .py, si j'en crée un.

Ce que je voulais faire:

Rendre un module python installable avec "pip install ..."

Si possible, je souhaite un processus général pas à pas pour l'écriture de Python modules.

339
yowmamasita

Un module est un fichier contenant Python définitions et instructions. Le nom du fichier est le nom du module avec le suffixe .py

créez hello.py puis écrivez la fonction suivante comme contenu:

def helloworld():
   print "hello"

Ensuite, vous pouvez importer hello:

>>> import hello
>>> hello.helloworld()
'hello'
>>>

Pour regrouper de nombreux fichiers .py, placez-les dans un dossier. Tout dossier avec un __init__.py est considéré comme un module par python et vous pouvez les appeler un paquet

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py

Vous pouvez utiliser la déclaration d'importation sur votre module de la manière habituelle.

Pour plus d'informations, voir 6.4. Packages .

398
Anuj

Python 3 - MIS À JOUR le 18 novembre 2015

J'ai trouvé la réponse acceptée utile, tout en souhaitant développer certains points au profit des autres, sur la base de mes propres expériences.

Module: Un module est un fichier contenant Python définitions et instructions. Le nom de fichier est le nom du module avec le suffixe .py ajouté.

Exemple de module : Supposons que nous ayons un seul script python dans le répertoire actuel, je l’appelle ici mymodule.py

Le fichier mymodule.py contient le code suivant:

def myfunc():
    print("Hello!")

Si nous exécutons l'interpréteur python3 à partir du répertoire en cours, nous pouvons importer et exécuter la fonction myfunc de différentes manières (vous pouvez généralement choisir l'une des options suivantes):

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!

Ok, donc c'était assez facile.

Supposons maintenant que vous ayez besoin de placer ce module dans son propre dossier dédié pour fournir un espace de nom de module, au lieu de l'exécuter simplement à partir du répertoire de travail en cours. C’est là qu’il convient d’expliquer le concept de package .

Package : les packages sont un moyen de structurer l’espace de noms de modules Python en utilisant des "noms de modules en pointillé". Par exemple, le nom de module AB désigne un sous-module nommé B dans un package nommé A. Tout comme l'utilisation de modules évite aux auteurs de modules différents de s'inquiéter des noms de variables globaux les uns des autres, l'utilisation de noms de modules en pointillé enregistre les auteurs. des packages multi-modules tels que NumPy ou la Python Imaging Library de s’inquiéter des noms de modules respectifs.

Exemple de package : Supposons maintenant que nous avons le dossier et les fichiers suivants. Ici, mymodule.py est identique à avant et __ init __. Py est un fichier vide:

.
└── mypackage
    ├── __init__.py
    └── mymodule.py

Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme contenant des packages. Pour plus d'informations, veuillez consulter le lien de la documentation sur les modules fourni ultérieurement.

Notre répertoire de travail actuel est un niveau au-dessus du dossier ordinaire appelé mypackage

$ ls
mypackage

Si nous exécutons maintenant l'interpréteur python3, nous pouvons importer et exécuter le module mymodule.py contenant la fonction requise myfunc de différentes manières (vous choisirez généralement l’une des options suivantes):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!

En supposant que Python 3, il existe une excellente documentation à l'adresse suivante: Modules

En ce qui concerne les conventions de dénomination des packages et des modules, les instructions générales sont données dans le PEP-0008 - Voir Nom des packages et des modules

Les modules doivent avoir des noms courts en minuscules. Les traits de soulignement peuvent être utilisés dans le nom du module si cela améliore la lisibilité. Les packages Python doivent également porter des noms courts en minuscules, bien que l'utilisation des traits de soulignement soit déconseillée.

217
arcseldon

Puisque personne n'a encore couvert cette question du PO:

Ce que je voulais faire:

Rendre un module python installable avec "pip install ..."

Voici un exemple minimal absolu, montrant les étapes de base de la préparation et du téléchargement de votre paquet vers PyPI en utilisant setuptools et twine.

Ceci n'est en aucun cas un substitut à en lisant au moins le tutoriel , il y a beaucoup plus que ce que couvre cet exemple très basique.

La création du paquet lui-même est déjà couverte par d'autres réponses ici, alors supposons que cette étape soit couverte et que la structure de notre projet soit la suivante:

.
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

Afin d'utiliser setuptools pour l'empaquetage, nous devons ajouter un fichier setup.py, qui se trouve dans le dossier racine de notre projet:

.
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

Au minimum, nous spécifions les métadonnées de notre paquet, notre setup.py ressemblerait à ceci:

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='a pip-installable package example',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='[email protected]',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)

Depuis que nous avons défini license='MIT', nous en incluons une copie dans notre projet sous le nom LICENCE.txt, ainsi qu'un fichier lisez-moi dans reStructuredText: README.rst:

.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

À ce stade, nous sommes prêts à commencer l’emballage avec setuptools, si nous ne l’avons pas déjà installé, nous pouvons l’installer avec pip:

pip install setuptools

Pour ce faire et créer un source distribution, dans le dossier racine de notre projet, nous appelons notre setup.py à partir de la ligne de commande, en spécifiant que nous voulons sdist:

python setup.py sdist

Ceci créera notre paquet de distribution et Egg-info, et donnera une structure de dossier comme celle-ci, avec notre paquet dans dist:

.
├── dist/
├── hellostackoverflow.Egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

À ce stade, nous avons un paquet que nous pouvons installer avec pip, donc à partir de la racine de notre projet (en supposant que vous ayez tous les noms comme dans cet exemple):

pip install ./dist/hellostackoverflow-0.0.1.tar.gz

Si tout se passe bien, nous pouvons maintenant ouvrir un interpréteur Python, je dirais quelque part en dehors de notre répertoire de projet pour éviter toute confusion, et essayez d'utiliser notre tout nouveau paquet:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'

Maintenant que nous avons confirmé l’installation et le fonctionnement du paquet, nous pouvons le télécharger sur PyPI.

Puisque nous ne voulons pas polluer le référentiel réel avec nos expériences, nous créons un compte pour le référentiel de test , et installons twine pour le processus de téléchargement:

pip install twine

Maintenant que nous sommes presque arrivés, avec notre compte créé, nous disons simplement à twine de télécharger notre paquet, il vous demandera nos informations d'identification et téléchargera notre paquet dans le référentiel spécifié:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

Nous pouvons maintenant nous connecter à notre compte sur le référentiel de tests PyPI et admirer notre paquet fraîchement téléchargé pendant un moment, puis le récupérer avec pip:

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow

Comme on peut le constater, le processus de base n’est pas très compliqué. Comme je l'ai dit plus tôt, il y a beaucoup plus que ce qui est couvert ici, alors allez-y et lisez le tutoriel pour une explication plus détaillée.

174
bgse

Une fois que vous avez défini les commandes que vous avez choisies, vous pouvez simplement faire glisser le fichier enregistré dans le dossier Lib de vos fichiers de programme python.

>>> import mymodule 
>>> mymodule.myfunc()
9
Dreamatronix

Faire un fichier nommé "hello.py"

Si vous utilisez Python 2.x

def func():
    print "Hello"

Si vous utilisez Python 3.x

def func():
    print("Hello")

Exécutez le fichier. Ensuite, vous pouvez essayer ce qui suit:

>>> import hello
>>> hello.func()
Hello

Si vous voulez un peu difficile, vous pouvez utiliser ce qui suit:

Si vous utilisez Python 2.x

def say(text):
    print text

Si vous utilisez Python 3.x

def say(text):
    print(text)

Voir celui sur la parenthèse à côté de définir? C'est important. C'est celui que vous pouvez utiliser dans la définition.

Texte - Vous pouvez l'utiliser quand vous voulez que le programme dise ce que vous voulez. Selon son nom, c'est du texte. J'espère que vous savez ce que le texte signifie. Cela signifie "mots" ou "phrases".

Exécutez le fichier. Ensuite, vous pouvez essayer ce qui suit si vous utilisez Python 3.x:

>>> import hello
>>> hello.say("hi")
hi
>>> from hello import say
>>> say("test")
test

Pour Python 2.x - Je suppose qu'il en va de même avec Python 3? Aucune idée. Corrigez-moi si j'ai fait une erreur sur Python 2.x (je sais que Python 2 mais je suis habitué avec Python 3)

3
Kakkoiikun

J'ai créé un projet pour lancer facilement un squelette de projet à partir de rien . https://github.com/MacHu-GWU/pygitrepo-project .

Et vous pouvez créer un projet de test, disons, learn_creating_py_package.

Vous pouvez apprendre quel composant vous devriez avoir à des fins différentes, comme :

  • créer virtualenv
  • s'installe
  • courir unittest
  • couverture du code d'exécution
  • document de construction
  • déployer le document
  • lancez unittest dans une version différente python
  • déployer à PYPI

L'avantage d'utiliser pygitrepo est que ces fastidieux sont automatiquement créés et adaptent votre package_name, project_name, github_account, document Host service, windows or macos or linux.

C'est un bon endroit pour apprendre à développer un projet python comme un pro.

J'espère que cela pourrait aider.

Je vous remercie.

1
MacSanhe