Come aggiungere un modulo Python a syspath?


69

Ho una struttura di file come questa:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

Voglio importare in foo2.py e foo1.py. Ho provato ma non funziona su Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

Hai un __init__.pyfile nella tua cartella? questo è il modo in cui Python crea pacchetti e consente di importare moduli da quel pacchetto. guide.python-distribute.org/creation.html
Bryan

Ho un file init.py in Common e in TestFolder
user284474,

ne hai bisogno nella cartella Cartella e nelle sottocartelle se vuoi importare
Bryan,

Questo init .py è vuoto?
user284474

1
sì, può essere vuoto. A meno che tu non abbia bisogno di una certa configurazione per il tuo pacchetto ma dovresti andare bene se è vuoto
Bryan,

Risposte:


115

Come python trova i suoi moduli

A rigor di termini, un modulo è un singolo file Python, mentre un pacchetto è una cartella contenente file Python, accompagnato da un file (che può essere vuoto) chiamato __init__.py, per dire a Python che è un pacchetto da cui importare i moduli. In entrambi i casi, i moduli necessitano della loro .pyestensione, ma l'importazione avviene senza (vedere più avanti).

Per impostazione predefinita, Python cerca i suoi moduli e pacchetti in $PYTHONPATH.

Per scoprire cosa è incluso in $ PYTHONPATH, esegui il seguente codice in python (3):

import sys
print(sys.path)

Come aggiungere una directory

Di tanto in tanto

Dall'interno di un file Python, è possibile aggiungere occasionalmente percorsi al percorso predefinito aggiungendo le seguenti righe nella sezione head dell'applicazione o dello script Python:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

Per esempio:

se ho una cartella: /home/myname/pythonfilese voglio importare il file module_1.py, che si trova in quella directory, lo aggiungo alla sezione head del mio codice:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

E posso semplicemente importare il file module_1.pytramite:

import module_1

Quando creo un pacchetto e desidero importare moduli dal pacchetto, devo creare una cartella $PYTHONPATHcontenente i moduli, accompagnata da un file (può essere vuoto) chiamato__init__.py

Per esempio:

Per importare da un pacchetto (cartella) denominata my_packagein /home/myname/pythonfiles, aggiungere il /home/myname/pythonfilespercorso al vostro $PYTHONPATH, come nell'esempio 1, e importare il modulo chiamato module_2.py(all'interno della cartella del pacchetto) semplicemente con: `

from <packagename> import module_2

Aggiunta di directory in modo $PYTHONPATHpermanente:

Aggiungi la seguente riga al tuo ~/.profilefile.

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

sottodirectory

Dall'interno di un pacchetto, le sottodirectory non sono incluse in questo modo; devi "incatenare" le directory. Per importare un modulo module_3.py, all'interno della cartella subfolderall'interno della cartella packagename:

import packagename.subfolder.module_3

Dato che tutte le sottocartelle nel pacchetto includono il proprio __init__.pyfile.

Quando un modulo si trova nella stessa directory dello script o dell'applicazione

Non è necessario inserire il percorso di un modulo quando si trova nella stessa directory dello script o dell'applicazione, viene automaticamente aggiunto.

Esempio:

Se ho una cartella contenente script.pye module.py, posso semplicemente importare il modulo tramite:

import module

Vorrei anche suggerire di leggere python.org/dev/peps/pep-0328 , specialmente se stai prendendo di mira Python 3 (o stai pianificando di mirare in futuro)
zaadeh,

Perché printenv PYTHONPATHniente?
Stevie G,

1
sys.path.append("/path/to/your/package_or_module")aggiunge anche un percorso al default ed è meno confuso. Rispetto al sys.path.insert(0,...)quale ha 0come primo argomento.
Paul Rougieux,

1
@PaulRougieux: il problema con l'aggiunta al percorso è che il tuo modulo potrebbe già esistere altrove nel percorso (ad esempio in un file .egg) e tu prenderai quella versione del tuo modulo invece di quella nel tuo file.
Snark

6

Il modo corretto di utilizzare l'importazione relativa è:

from ..Common import foo1

E hai anche bisogno di un __init__.pyin tutte le tue cartelle.


1
Grazie. Ma se ho un modulo composto da due cartelle. Come posso importarlo? da .... La cartella non funziona
user284474

Funziona con un solo livello?
Sylvain Pineau,

Funziona con un solo livello.
user284474,

ok, potresti per favore accettare questa risposta? per il multilivello, anche se potresti porre una domanda diversa, ma prima dai un'occhiata a questa domanda e questa risposta per il modo migliore per chiamare i tuoi moduli all'interno di un pacchetto
Sylvain Pineau,

È vero per Python 2 o Python 3? O entrambi?
alex

2

NB: questa risposta è obsoleta per l'ultima versione di Python 3, ma è qui per la versione precedente. Per maggiori informazioni leggi i commenti e https://www.python.org/dev/peps/pep-0420/


In sostanza ogni cartella con codice Python che desideri aggiungere al syspath necessita di un file __init__.py. Questi file __init__.py possono essere vuoti.


A quanto ho capito, questo non è più il caso, la directory ora diventa uno "spazio dei nomi".
Aaron Hall,

@AaronHall interessante, fonte?
don.joey,

1
Prova questo per prove: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"ecco anche una documentazione pertinente, PEP 420, che descrive l'aggiunta della semantica del pacchetto dello spazio dei nomi
Aaron Hall
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.