2012-02-21 18 views
69

Ho difficoltà a capire come funziona l'importazione dei moduli in Python (non l'ho mai fatto prima in nessun'altra lingua).Impossibile importare i miei moduli in Python

Diciamo che ho:

myapp/__init__.py 
myapp/myapp/myapp.py 
myapp/myapp/SomeObject.py 
myapp/tests/TestCase.py 

Ora sto cercando di ottenere qualcosa di simile:

myapp.py 
=================== 
from myapp import SomeObject 
# stuff ... 

TestCase.py 
=================== 
from myapp import SomeObject 
# some tests on SomeObject 

Comunque, sto sicuramente facendo qualcosa di sbagliato, come Python non può vedere che myapp è un modulo:

ImportError: No module named myapp 

risposta

53

Nel tuo caso particolare, sembra che si sta cercando di importare SomeObject dal myapp.py e Script TestCase.py. Da myapp.py, fare

import SomeObject 

poiché si trova nella stessa cartella. Per TestCase.py, fare

from ..myapp import SomeObject 

Tuttavia, questo funziona solo se si sta importando TestCase dal pacchetto. Se vuoi eseguire direttamente lo python TestCase.py, dovresti rovinare il tuo percorso. Questo può essere fatto all'interno di Python:

import sys 
sys.path.append("..") 
from myapp import SomeObject 

sebbene generalmente non sia raccomandato.

In generale, se si desidera che altre persone utilizzino il pacchetto Python, è necessario utilizzare distutils per creare uno script di installazione. In questo modo, chiunque può installare facilmente il pacchetto utilizzando un comando come python setup.py install e sarà disponibile ovunque sul proprio computer. Se si prende sul serio il pacchetto, è anche possibile aggiungerlo all'indice del pacchetto Python, PyPI.

+0

Ho provato semplicemente a usare" import' nel mio 'TestCase.py' ma mi ha comunque dato lo stesso errore. Suppongo che sia perché è in una sottodirectory di '__init __. Py'? – n0pe

+0

Oh aspetta penso di averlo capito. Se i miei casi di test stanno chiamando dal pacchetto, sarò in grado di usare "da ... import ..." giusto? – n0pe

+1

Solo se TestCase viene importato dall'esterno del pacchetto, ad esempio, se eseguo 'da myapp.tests importate TestCase da uno script all'esterno di myapp. Se stai eseguendo 'python TestCase.py' nella cartella dei test non puoi fare le importazioni relative –

20

La funzione import cerca fil nel tuo PYTHONPATH env. variabile e la tua directory locale. Così è possibile inserire tutti i file nella stessa cartella, o esportare il percorso a digitare in un terminale ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/" 
+0

Quindi, come posso assicurarmi che funzioni per tutti gli altri che lo utilizzano? Preferirei non dover dire loro di impostare determinate variabili d'ambiente prima di eseguirlo. – n0pe

+0

la directory corrente è in pythonpath, quindi finché gli script si trovano nella stessa cartella/directory dovrebbe funzionare. sfortunatamente ognuno di questi script si trova in directory separate. – JKirchartz

+2

Per gli utenti di Windows, invece di "export' abbiamo" impostato PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \ " –

8

percorso di esportazione è un buon modo. Un altro modo è aggiungere un .pth alla posizione dei pacchetti del sito. sul mio Mac mio pitone mantiene site-packages in/Library/Python Di seguito riportiamo

/Library/Python/2.7/site-packages 

ho creato un file chiamato awesome.pth a /Library/Python/2.7/site-packages/awesome.pth e nel file di mettere il seguente percorso che fa riferimento i miei moduli impressionante

/opt/awesome/custom_python_modules 
+1

nel caso in cui sto lavorando in windows come faccio a fare quello –

+0

non ne sono sicuro. Nel caso in cui si sta utilizzando Windows. Trova alcuni software VM e usa Linux. Oppure - guarda questa risposta sull'esportazione di variabili in Windows. http://stackoverflow.com/questions/559816/how-to-export-and-import-environment-variables-in-windows – jmontross

+0

questo è esattamente quello che mi serviva – Lee88

2

si può provare

from myapp.myapp import SomeObject 

perché il nome del progetto è lo stesso del myapp.py che lo rende cercare il progetto d ocument first

0

Nella tua prima directory myapp, puoi aggiungere un file setup.py e aggiungere due codice python nella configurazione.py

from setuptools import setup 
setup(name='myapp') 

nella prima directory myapp in riga di comando, utilizzare pip install -e. per installare il pacchetto

Problemi correlati