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

Ciężko mi zrozumieć, jak importowanie modułów działa 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ę dostać coś takiego:

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

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

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

ImportError: No module named myapp
Author: n0pe, 2012-02-21

9 answers

W twoim konkretnym przypadku wygląda na to, że próbujesz zaimportować SomeObject z myapp.py oraz TestCase.py Skrypty. Od myapp.py, do

import SomeObject

Ponieważ znajduje się w tym samym folderze. Na TestCase.py, do

from ..myapp import SomeObject

jednakże , będzie to działać tylko wtedy, gdy importujesz TestCase z pakietu. Jeśli chcesz bezpośrednio uruchomić python TestCase.py, musisz namieszać w swojej ścieżce. Można to zrobić w Pythonie:

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

Choć generalnie nie jest to zalecane.

W ogólne, jeśli chcesz, aby inne osoby korzystały z Twojego pakietu Pythona, powinieneś użyć distutils aby utworzyć skrypt instalacyjny. W ten sposób każdy może łatwo zainstalować pakiet używając komendy python setup.py install i będzie on dostępny wszędzie na jego komputerze. Jeśli myślisz poważnie o pakiecie, możesz nawet dodać go do indeksu pakietów Pythona, PyPI.

 105
Author: David Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 18:46:03

Funkcja import szuka plików w Twoim PYTHONPATH env. zmienna i twój katalog lokalny. Możesz więc albo umieścić wszystkie pliki w tym samym katalogu, albo wyeksportować wpisaną ścieżkę do terminala::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
 45
Author: Zenon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 11:16:37

Eksportowanie ścieżki jest dobrym sposobem. Innym sposobem jest dodanie .pth do twojej witryny-lokalizacja pakietów. Na moim Macu mój python przechowuje site-packages w /Library/Python pokazanym poniżej

/Library/Python/2.7/site-packages

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

/opt/awesome/custom_python_modules
 11
Author: jmontross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-20 23:36:23

Możesz spróbować

from myapp.myapp import SomeObject

Ponieważ nazwa projektu jest taka sama jak myapp.py co sprawia, że najpierw przeszukuje dokument projektu

 9
Author: 阿东刘,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 13:54:15

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

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

W pierwszym katalogu myapp w wierszu poleceń , użyj pip install-e . aby zainstalować pakiet

 3
Author: 未来陆家嘴顶尖的投资人,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-28 11:30:43

pip install w systemie Windows 10 domyślnie instaluje się w "Program Files/PythonXX/Lib/site-packages", który jest katalogiem wymagającym uprawnień administracyjnych. Więc naprawiłem mój problem przez uruchomiony pip install jako Administrator (musisz otworzyć wiersz polecenia jako administrator, nawet jeśli jesteś zalogowany za pomocą konta administratora). Bezpieczniej jest również zadzwonić do pip z Pythona.
np.
python -m pip install <package-name>
zamiast
pip install <package-name>

 3
Author: sziraqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 09:12:17

Musisz mieć

__init__.py

We wszystkich folderach z kodem, z którym musisz współpracować. Musisz również określić górną nazwę folderu projektu przy każdym imporcie, nawet jeśli plik, który próbowałeś zaimportować, znajduje się na tym samym poziomie.

 1
Author: Krysalead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-05 15:42:54

W moim przypadku był to Windows vs Python niespodzianka, mimo że nazwy plików Windows nie są wrażliwe na wielkość liter, import Pythona jest. Więc jeśli Masz plik Stuff.py, musisz zaimportować tę nazwę tak, jak jest.

 0
Author: astrowalker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 09:31:12

Powiedzmy, że piszę Moduł

import os
my_home_dir=os.environ['HOME'] // in windows 'HOMEPATH'
file_abs_path=os.path.join(my_home_dir,"my_module.py")

with open(file_abs_path,"w") as f:
   f.write("print('I am loaded successfully')")

import importlib
importlib.util.find_spec('my_module') ==> cannot find

Musimy powiedzieć pythonowi, gdzie szukać modułu. musimy dodać naszą ścieżkę do sys.path

 import sys
 sys.path.append(file_abs_path)

Now importlib.util.find_spec('my_module') zwraca:

  ModuleSpec(name='my_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa40143e8e0>, origin='/Users/name/my_module.py')

Stworzyliśmy nasz moduł, poinformowaliśmy Pythona o jego ścieżce, teraz powinniśmy móc go zaimportować

 import my_module

//I am loaded successfully
 0
Author: Yilmaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-14 02:09:29