2012-02-24 22 views
11

So che ci sono un sacco di domande simili sullo stack overflow. Ma la risposta comune non sembra funzionare per me.percorso relativo non funziona anche con __init__.py

Ho una struttura di file come questo

proj/ 
     lib/ 
      __init__.py 
      aa.py 
      bb.py 
      test/ 
       __init__.py 
       aa_test.py 

Ho pensato che se includo il codice nel mio test.py

import lib.aa 

o

from lib import aa 

sarei stato in grado per fare riferimento ai moduli nella directory lib/. Ma quello non ha funzionato.

così ho cercato di aggiungere al percorso, e si aggiunge in modo corretto:

os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..","")) 
print os.environ["PATH"] 

ma ancora adesso quando cerco le istruzioni di importazione di cui sopra ... continuo a ricevere l'errore

ImportError: No module named aa 

o

ImportError: Importing from non-package <Something...> 

C'è qualcosa di ovvio che mi manca?

C'è un modo per controllare se ho configurato correttamente i miei file __init__.py o per vedere la mia gerarchia di pacchetti?

risposta

13

è necessario aggiornare il vostro sys.path, che è dove pitone sembra per i moduli, in contrasto con il percorso del sistema nel contesto attuale, che è quello che os.environ["PATH"] si riferisce.

Esempio:

import os, sys 
sys.path.insert(0, os.path.abspath("..")) 
import aa 

Dopo aver fatto questo, è possibile utilizzare le funzioni in aa come questo: aa.myfunc()

C'è qualche informazione in più nel accepted answer per la variabile PATH python: import a module from a directory

2

La directory lib deve trovarsi nel percorso di ricerca del modulo Python, che non è la stessa cosa del percorso di ricerca utilizzato dalla shell.

Questo sarà probabilmente il lavoro per voi:

import sys, os 
sys.path.append(os.path.abspath("..")) 

Tuttavia, è probabilmente meglio per eseguire il codice da un contesto in cui il pacchetto lib è già sul percorso. Ad esempio dalla directory 'proj'.

1

Dove si trova il codice da cui si sta tentando di importare lib.aa? Sto indovinando/proj/non è la tua directory di lavoro e dovrebbe essere come è impostato in questo momento. Invece di PATH, vorresti aggiungere la tua directory a PYTHONPATH in modo che appaia nel percorso di ricerca per un'importazione. Vedere http://docs.python.org/tutorial/modules.html#the-module-search-path

Inoltre, si prega di dare un'occhiata a http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html Si raccomanda vivamente di mettere un ulteriore livello di directory in atto in modo, invece di lib.aa, si dovrebbe fare riferimento ad esso come my_proj.lib.aa.

0

System non è usato dall'istruzione import python. Usa PYTHONPATH, ma il modo migliore per aggiungere una nuova directory per importare il percorso di ricerca è modificare sys.path.

Se ciò non aiuta, aggiungere alla domanda il valore di sys.path e il valore restituito da os.getcwd().

0

Ho avuto problemi simili ed ecco il mio consiglio.

Invece di modificare sys.path, è meglio eseguire il test.py dalla directory proj (ovvero root di progetto). In questo modo la directory del progetto sarà automaticamente in sys.path e sarà possibile importare il pacchetto lib.

E utilizzare le importazioni assolute.

Problemi correlati