Nie mogę zaimportować własnych modułów w Pythonie

141

Trudno mi zrozumieć, jak działa importowanie modułów w Pythonie (nigdy wcześniej nie robiłem tego w żadnym innym języku).

Powiedzmy, że 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 zdecydowanie robię coś nie tak, ponieważ Python nie widzi, że myappjest to moduł:

ImportError: No module named myapp
n0pe
źródło

Odpowiedzi:

96

W Twoim przypadku wygląda na to, że próbujesz zaimportować SomeObjectze skryptów myapp.py i TestCase.py. Z myapp.py, zrób

import SomeObject

ponieważ znajduje się w tym samym folderze. W przypadku TestCase.py zrób

from ..myapp import SomeObject

Jednak zadziała to tylko wtedy, gdy importujesz TestCase z pakietu. Jeśli chcesz biec bezpośrednio python TestCase.py, musiałbyś zepsuć swoją ścieżkę. Można to zrobić w Pythonie:

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

chociaż generalnie nie jest to zalecane.

Ogólnie, jeśli chcesz, aby inne osoby korzystały z Twojego pakietu Pythona, powinieneś użyć distutils do stworzenia skryptu instalacyjnego. W ten sposób każdy może łatwo zainstalować Twój pakiet za pomocą polecenia takiego jak python setup.py installi 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 pakietów Pythona, PyPI .

David Robinson
źródło
Próbowałem po prostu użyć importw moim, TestCase.pyale nadal dawało mi to ten sam błąd. Zakładam, że to dlatego, że znajduje się w podkatalogu __init__.py?
n0pe
Och, czekaj, myślę, że to rozumiem. Jeśli moje przypadki testowe dzwonią z pakietu, będę mógł użyć from ... import ...prawa?
n0pe
1
Będziesz tylko wtedy, gdy TestCase jest importowany spoza pakietu - na przykład, jeśli uruchomię from myapp.tests import TestCase from a script outside myapp. If you're running python TestCase.py` w folderze testów, nie możesz wykonać importu względnego
David Robinson
1
Uruchomiłem „pip install -e.”, Aby zainstalować moją aplikację, ale podczas próby uruchomienia TestCase w kodzie programu Visual Studio nadal otrzymuję komunikat „ImportError: Brak modułu o nazwie myapp”. ale jeśli uruchomię „python”, a następnie uruchomię w pythonie „from myapp import SomeObject”, to działa. Co ja robię źle?
dagrun
@DavidRobinson Użyłem metody, o której wspomniałeś, która po wykonaniu nie pokazała żadnego błędu from fodername import file_name_of_my_py_code, ale kiedy próbowałem uzyskać dostęp do zdefiniowanego w file_name_of_my_py_code.pyniej obiektu, mówiNameError: name 'ClassName' is not defined
Kavin Raju S
44

Funkcja importszuka plików w Twoim środowisku PYTHONPATH. zmienna i katalog lokalny. Możesz więc albo umieścić wszystkie swoje pliki w tym samym katalogu, albo wyeksportować ścieżkę wpisując do terminala:

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
Zenon
źródło
2
W takim razie jak mogę się upewnić, że działa on dla wszystkich, którzy będą go używać? Wolałbym nie musieć im mówić, aby ustawili pewne zmienne środowiskowe przed uruchomieniem.
n0pe
1
bieżący katalog jest 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,
4
W przypadku użytkowników systemu Windows zamiast export„set PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \”
kochany.by.Jesus
W kodzie vs udało mi się to naprawić, dodając zmienną PYTHONPATH Env do mojego launch.json: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Michael Armitage
11

ścieżka eksportu to dobry sposób. Innym sposobem jest dodanie .pth do lokalizacji pakietów witryn. Na moim Macu mój Python przechowuje pakiety witryn w / Library / Python pokazane poniżej

/Library/Python/2.7/site-packages

Utworzyłem plik o nazwie awesome.pth w /Library/Python/2.7/site-packages/awesome.pth i umieściłem w nim następującą ścieżkę, która odwołuje się do moich niesamowitych modułów

/opt/awesome/custom_python_modules
jmontross
źródło
1
w przypadku, gdy pracuję w systemie Windows, jak to zrobić
Nwawel A Iroume
Nie jestem pewny. W przypadku korzystania z systemu Windows. Znajdź oprogramowanie vm i użyj linuxa. Lub - zobacz tę odpowiedź na temat eksportowania zmiennych w systemie Windows. stackoverflow.com/questions/559816/…
jmontross
to jest dokładnie to, czego potrzebowałem
Lee88
1
Cieszę się, że @ Lee88 - zajęło mi trochę czasu,
zanim
9

Możesz spróbować

from myapp.myapp import SomeObject

ponieważ nazwa twojego projektu jest taka sama jak myapp.py, co powoduje, że najpierw przeszukuje dokument projektu

阿 东 刘
źródło
3

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

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

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

未来 陆家嘴 顶尖 的 投资 人
źródło
2

pip installw systemie Windows 10 domyślnie instaluje się w „Program Files / PythonXX / Lib / site-packages”, który jest katalogiem wymagającym uprawnień administratora. Więc naprawiłem mój problem, uruchamiając pip install jako administrator (musisz otworzyć wiersz polecenia jako administrator, nawet jeśli jesteś zalogowany na konto administratora). Bezpieczniej jest też wywoływać pip z pythona.
np.
python -m pip install <package-name>
zamiast
pip install <package-name>

sziraqui
źródło
0

W moim przypadku była to niespodzianka Windows vs Python, mimo że nazwy plików Windows nie uwzględniają wielkości liter, import Pythona jest. Więc jeśli masz Stuff.pyplik, musisz zaimportować tę nazwę bez zmian.

astrowalker
źródło
0

Musisz mieć

__init__.py

we wszystkich folderach, które zawierają kod, z którym musisz wejść w interakcję. Musisz także określić nazwę głównego folderu projektu w każdym imporcie, nawet jeśli plik, który próbujesz zaimportować, jest na tym samym poziomie.

Krysalead
źródło