2012-02-21 27 views
69

Trudno mi zrozumieć, w jaki sposób importowanie modułów działa w Pythonie (nigdy wcześniej nie robiłem tego w żadnym innym języku).Nie mogę zaimportować własnych modułów w Pythonie

Powiedzmy mam:

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

Teraz próbuję uzyskać coś takiego:

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

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

Jednak jestem zdecydowanie robi coś złego, jak Python nie widzi, że myapp jest modułem:

ImportError: No module named myapp 

Odpowiedz

53

W danym przypadku wygląda na to, że próbujesz importować SomeObject z myapp.py i Skrypty TestCase.py. Od myapp.py, do

import SomeObject 

ponieważ jest w tym samym folderze. Dla TestCase.py, zrobić

from ..myapp import SomeObject 

Jednak, to będzie działać tylko wtedy, gdy są importowane TestCase z opakowania. Jeśli chcesz bezpośrednio uruchomić python TestCase.py, musiałbyś zepsuć swoją ścieżkę. Można to zrobić w języku Python:

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

mimo to nie jest to zalecane.

Ogólnie, jeśli chcesz, aby inne osoby używały pakietu Python, powinieneś użyć distutils, aby utworzyć skrypt instalacyjny. W ten sposób każdy może łatwo zainstalować pakiet za pomocą polecenia, takiego jak python setup.py install i będzie on dostępny wszędzie na jego komputerze. Jeśli poważnie myślisz o pakiecie, możesz nawet dodać go do indeksu Pythona, PyPI.

+0

Próbowałem po prostu używając' import' w moim 'TestCase.py' ale nadal dał mi ten sam błąd. Zakładam, że jest tak, ponieważ znajduje się w podkatalogu '__init __. Py'? – n0pe

+0

Och, czekaj, myślę, że to rozumiem. Jeśli moje przypadki testowe będą wywoływać z pakietu, będę mógł użyć polecenia 'from ... import ... ', prawda? – n0pe

+1

Będziesz tylko wtedy, gdy TestCase jest importowany spoza pakietu - na przykład, jeśli uruchomię 'from myapp.tests import TestCase ze skryptu poza myappą. Jeśli używasz 'python TestCase.py' w folderze testów, nie możesz wykonać względnego importu –

20

funkcja import szuka fil es do twojego PYTHONPATH env. zmienna i twój lokalny katalog. Więc można też umieścić wszystkie swoje pliki w tym samym katalogu, lub wyeksportować ścieżkę wpisując w terminalu ::

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

Jak mogę się upewnić, że działa on dla wszystkich, którzy z niego korzystają? Wolałbym nie mówić im, żeby ustawili pewne zmienne środowiskowe przed uruchomieniem. – n0pe

+0

bieżący katalog znajduje się w pythonpath, więc dopóki skrypty znajdują się w tym samym folderze/katalogu, powinien działać. niestety każdy z tych skryptów znajduje się w osobnych katalogach. – JKirchartz

+2

Dla użytkowników Windows zamiast 'export' mamy ustawione" PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \ " –

8

ścieżka eksportu jest dobrym sposobem. Innym sposobem jest dodanie .pth do lokalizacji twoich pakietów stron. na moim Mac mój pyton utrzymuje site-packages w/Library/Python poniżej

/Library/Python/2.7/site-packages 

stworzyłem plik o nazwie awesome.pth na /Library/Python/2.7/site-packages/awesome.pth aw plik umieścić następującą ścieżkę, która odwołuje swoje niesamowite moduły

/opt/awesome/custom_python_modules 
+1

w przypadku gdy pracuję w Windows, jak to zrobić –

+0

Nie jestem pewien. W przypadku korzystania z systemu Windows. Znajdź jakieś oprogramowanie vm i użyj linuksa. Lub - zobacz tę odpowiedź przy eksportowaniu zmiennych w oknach. http://stackoverflow.com/questions/559816/how-to-export-and-import-environment-variables-in-windows – jmontross

+0

to jest dokładnie to, czego potrzebowałem – Lee88

2

można spróbować

from myapp.myapp import SomeObject 

ponieważ nazwa projektu jest taka sama jak myapp.py co czyni go szukać projektu d Najpierw na przykład

0

W swoim pierwszym katalogu myapp możesz dodać plik setup.py i dodać dwa kody Pythona w konfiguracji.py

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

w twoim pierwszym katalogu myapp w linii poleceń, użyj pip install -e. zainstalować pakiet

Powiązane problemy