Ho fatto script Python per compiti semplici al lavoro e non mi sono mai preoccupato di impacchettarli per farli usare ad altri. Ora mi è stato assegnato di fare un wrapper Python per un'API REST. Non ho assolutamente idea di come iniziare e ho bisogno di aiuto.
Cosa ho:
(Voglio solo essere il più specifico possibile) Ho il virtualenv pronto, è anche su in github, il file .gitignore per python è anche lì, più, la requests library per interagire con l'API REST. Questo è tutto.
Ecco l'albero della directory corrente
.
├── bin
│ └── /the usual stuff/
├── include
│ └── /the usual stuff/
├── lib
│ └── python2.7
│ └── /the usual stuff/
├── local
│ └── /the usual stuff/
└── README.md
27 directories, 280 files
Non so nemmeno dove mettere i file .py, se mai ne farò uno.
Cosa volevo fare:
Rendere un modulo python installabile con "pip install ..."
Se possibile, voglio un processo generale passo dopo passo sulla scrittura di moduli Python.
Un modulo è un file che contiene definizioni e dichiarazioni Python. Il nome del file è il nome del modulo con il suffisso .py
.
creare hello.py
poi scrivere la seguente funzione come suo contenuto:
def helloworld():
print "hello"
Poi puoi importare hello
:
>>> import hello
>>> hello.helloworld()
'hello'
>>>
Per raggruppare molti file .py
metteteli in una cartella. Ogni cartella con un __init__.py
è considerata un modulo da python e si può chiamare un pacchetto
|-HelloModule
|_ __init__.py
|_ hellomodule.py
Puoi procedere con la dichiarazione di importazione sul tuo modulo nel solito modo.
Per maggiori informazioni, vedere 6.4. Pacchetti.
Python 3 - Aggiornato il 18 novembre 2015
*Ho trovato utile la risposta accettata, ma desidero espandere diversi punti a beneficio di altri sulla base delle mie esperienze personali.
Modulo: Un modulo è un file contenente definizioni e dichiarazioni Python. Il nome del file è il nome del modulo con l'aggiunta del suffisso .py.
Esempio di modulo: Supponiamo di avere un singolo script python nella directory corrente, qui lo sto chiamando mymodule.py
Il file mymodule.py contiene il seguente codice:
def myfunc():
print("Hello!")
Se eseguiamo l'interprete python3 dalla directory corrente, possiamo importare ed eseguire la funzione myfunc nei seguenti modi diversi (di solito si sceglie solo uno dei seguenti):
>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!
Ok, è stato abbastanza facile.
Ora supponiamo che abbiate la necessità di mettere questo modulo nella sua cartella dedicata per fornire uno spazio dei nomi al modulo, invece di eseguirlo ad-hoc dalla directory di lavoro corrente. È qui che vale la pena spiegare il concetto di pacchetto.
Pacchetto: I pacchetti sono un modo di strutturare lo spazio dei nomi dei moduli di Python usando "nomi di moduli punteggiati". Per esempio, il nome del modulo A.B designa un sottomodulo chiamato B in un pacchetto chiamato A. Proprio come l'uso dei moduli evita agli autori di moduli diversi di doversi preoccupare dei nomi delle variabili globali l'uno dell'altro, l'uso di nomi di moduli punteggiati evita agli autori di pacchetti multi-modulo come NumPy o la Python Imaging Library di doversi preoccupare dei nomi dei moduli dell'altro.
Esempio di pacchetto: Supponiamo ora di avere la seguente cartella e i seguenti file. Qui, mymodule.py è identico a prima, e init.py è un file vuoto:
.
└── mypackage
├── __init__.py
└── mymodule.py
I file __init__.py sono necessari per far sì che Python tratti le directory come contenenti pacchetti. Per ulteriori informazioni, si veda il link alla documentazione sui Moduli fornito più avanti.
La nostra directory di lavoro corrente è un livello sopra la cartella ordinaria chiamata mypackage
$ ls
mypackage
Se ora eseguiamo l'interprete python3, possiamo importare ed eseguire il modulo mymodule.py contenente la funzione richiesta myfunc nei seguenti modi diversi (di solito si sceglie solo uno dei seguenti):
>>> 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!
Assumendo Python 3, c'è un'eccellente documentazione presso: Moduli
In termini di convenzioni di denominazione per pacchetti e moduli, le linee guida generali sono date in PEP-0008 - si veda Package and Module Names
I moduli dovrebbero avere nomi brevi, tutti in minuscolo. I trattini bassi possono essere usati nel nome del modulo se questo migliora la leggibilità. Anche i pacchetti Python dovrebbero avere nomi brevi, tutti in minuscolo, sebbene l'uso dei trattini bassi sia scoraggiato.