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.