2012-07-13 1 views
5

Sto sperimentando con Python, principalmente la risoluzione dei problemi del codice di altre persone. Sto cercando di far funzionare un programma, "path\folderA\program.py".Impossibile importare Python da un'altra cartella

Sono in esecuzione il programma da path\folderA

sto ottenendo un errore:

ImportError: No module named fff.ggg.ppp 

program.py contiene un import:

from fff.ggg.ppp import mmm 

Nella cartella "percorso \ folderB" ci sono: "path\folderB\fff\__init__.py" "path\folderB\fff\ggg"

cartella ggg contiene anche __init__.py, così come programma ppp.py

dalla lettura di altri posti, come Python error "ImportError: No module named" ho capito che avere il __init__.py fa una cartella di un "pacchetto" che rende le importazioni dalla possibile - ma doesn' lavoro, dal momento che sto ricevendo un errore.

Questo ha funzionato per altre persone che hanno lavorato con questi progetti, quindi c'è qualcosa di sbagliato nella mia configurazione.

Ho letto qualcosa sulle directory che devono trovarsi in sys.path. Ciò significa che devo aggiungerli al percorso della variabile d'ambiente? Ciò significherebbe aggiungere molte directory al PERCORSO, quindi non può essere.

Così ho anche trovato la seguente:

import sys 
sys.path.append(<path to FolderB>) 

Ma questo significa cambiare il codice (che non è stato necessario per gli altri) e codificare un percorso a quello che è sulla mia macchina locale - che Non dovrei, no?

Non riesco a visualizzarlo - apparentemente non dovrei cambiare il codice e codificare il percorso fisico del modulo di importazione - quindi come può un programma dalla cartellaA anche sapere di cercare nella cartella B per un'importazione?

Come funziona la magia di __init__.py?

+1

Python analizza la variabile di ambiente 'PYTHONPATH', non' PATH' – mgilson

risposta

1

I can't visualize it - apparently I am not supposed to change the code and hard-code the physical path to the import module - so how can a program from folderA even know to look in folderB for an import ?

Sei corretto. In qualche modo devi dire a python di cercare i moduli importati nella cartellaB. Non esiste la magia __init__.py che ti consente di importare da altre cartelle sul tuo disco rigido.

In genere, se si dispone di vari pacchetti Python come questi, funzionano installandosi nella libreria di python. In questo modo possono essere importati da qualsiasi luogo. Di solito questo è ottenuto da uno script setup.py. Controlla se folderB ne ha uno.Eseguilo con python setup.py install.

Se ciò non funziona, avremo bisogno di ulteriori informazioni su come questo codice è strutturato.

+0

Grazie, ho visto setup.py ma non sapevo come usarlo. Ha funzionato ! – Thalia

0

La cartella B deve trovarsi su sys.path, quindi è necessario spostare mmm in A o modificare sys.path da A (non è sicuro se funziona). __init__.py dice a python che la cartella è un pacchetto, quindi è possibile avere cartelle con __init__.py all'interno di cartelle con __init__.py e Python considera le cartelle all'interno come parti della cartella principale. Controlla sympy o quasi una grande libreria python e troverai questa struttura. Può anche contenere codice da eseguire all'importazione, ma può anche essere vuoto.