2011-09-28 15 views
58

Ho un'applicazione di pitone con la seguente struttura di directory:ImportError: No module named - Python

src 
| 
+---- main 
| 
+---- util 
| 
+---- gen_py 
     | 
     +---- lib 

Nel pacchetto principale, ho un modulo Python chiamato MyServer.py che ha un import dichiarazione come:

from gen_py.lib import MyService 

Affinché questa dichiarazione al lavoro, ho messo la seguente riga all'inizio del MyServer.py:

import sys 
sys.path.append('../gen_py/lib') 

Quando eseguo MyServer.py nel terminale, ottengo il seguente errore:

ImportError: No module named gen_py.lib

Quello che mi manca qui?

+0

Qual era la riga di comando che hai usato per eseguire MyServer.py? In che directory eri? –

risposta

69

La modifica di sys.path presuppone che la directory di lavoro corrente sia sempre in main/. Questo non è il caso. Invece, basta aggiungere la directory genitore di sys.path:

import sys 
import os.path 

sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 
import gen_py.lib 

Non dimenticare di includere un file __init__.py in gen_py e lib - in caso contrario, non saranno riconosciuti come moduli Python.

+0

Questo ha aiutato, grazie. –

+0

Ho lo stesso problema. Io uso Windows, Eclipse. Cosa dovremmo fare in Eclipse? – Ayse

+0

@Ceren Questo codice dovrebbe funzionare in ogni IDE. Il tuo IDE (o più precisamente il plugin Python per esso) potrebbe non eseguire il codice Python, nel qual caso probabilmente dovrai configurare il percorso di ricerca da qualche parte. Sentiti libero di [fare una nuova domanda] (http://stackoverflow.com/questions/ask) a riguardo. – phihag

6

Per l'importazione del modulo Python, è necessario avere "src" nel percorso, non "gen_py/lib".

Durante l'elaborazione di un'importazione come import gen_py.lib, sembra per un modulo gen_py, poi cerca un modulo lib.

Poiché il modulo gen_py non ci sarà in "../gen_py/lib" (che sarà in ".."), il percorso è stato aggiunto non farà nulla per aiutare il processo di importazione.

A seconda di dove lo si sta eseguendo, provare ad aggiungere il percorso relativo alla cartella "src". Forse è sys.path.append('..'). Si potrebbe anche avere successo l'esecuzione dello script, mentre all'interno della cartella src direttamente, tramite i percorsi relativi come python main/MyServer.py

+0

Ho provato questo sys.path.append ('../../src/gen_py/lib') ma ottengo lo stesso errore ... –

+0

Questo non è quello che ho detto. Non si aggiunge gen_py/lib al percorso se si sta importando "gen_py.lib". Si aggiunge la cartella gen_py al suo interno, che in questo caso è probabilmente "..". – lunixbochs

5
from ..gen_py.lib import MyService 

o

from main.gen_py.lib import MyService 

Assicurarsi di avere una (almeno vuoto) __init__.py file in ogni directory .

3

Assicurati di includere __init__.py, il che rende Python sa che quelle directory containpackages

3

Questo è se si sta costruendo un pacchetto e si stanno trovando errori nelle importazioni. L'ho imparato nel modo più duro. La risposta non è di aggiungere il pacchetto al path python o di farlo in modo programmato (cosa succede se il modulo viene installato e il tuo comando lo aggiunge di nuovo?) Questo è un brutto modo.

La cosa giusta da fare è: 1) Utilizzare virtualenv pyvenv-3.4 o qualcosa di simile 2) Attivare la modalità di sviluppo - $ python setup.py develop

Problemi correlati