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
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.
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/"
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
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
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
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>
zamiastpip install <package-name>
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.
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.
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
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