Mam plik o nazwie tester.py
, znajduje się na /project
.
/project
ma wywołany podkatalog lib
z plikiem o nazwie BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Chcę importować BoxTime
z tester
. Próbowałem tego:
import lib.BoxTime
Co spowodowało:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Wszelkie pomysły na importowanie BoxTime
z podkatalogu?
EDYTOWAĆ
__init__.py
Był problem, ale nie zapomnij, aby zapoznać się BoxTime
jak lib.BoxTime
, lub zastosowanie:
import lib.BoxTime as BT
...
BT.bt_function()
python
module
subdirectory
python-import
Adam Matan
źródło
źródło
__init__
plików zakodowanych na stałe (ale jeśli chcesz, po prostu zarejestruj hak do automatycznego ładowania! To jest różnica między hacky a hackable ).import sys, os; sys.path.insert(0, os.path.abspath('..')); from sibling_package.hacks import HackyHackHack
lib
.lib\__init__.py
.W
lib\BoxTime.py
napisz taką funkcjęfoo()
:W kodzie klienta w powyższym katalogu
lib
wpisz:Uruchom kod klienta. Dostaniesz:
Znacznie później - w systemie Linux wyglądałoby to tak:
źródło
lib
Możesz spróbować wstawić go do
sys.path
:źródło
cd /data
,python ../project/tester.py
. To nie zadziała.Piszę to, ponieważ wszyscy sugerują, że musisz utworzyć
lib
katalog.Nie musisz nazywać swojego podkatalogu
lib
. Możesz go nazwać,anything
pod warunkiem, że__init__.py
go umieścisz .Możesz to zrobić, wprowadzając następujące polecenie w powłoce linux:
Więc teraz masz tę strukturę:
Następnie możesz zaimportować
mylib
wmain.py
następujący sposób:Możesz także zaimportować funkcje i klasy w następujący sposób:
__init__.py
Dostęp do dowolnej funkcji zmiennej lub klasy, którą umieścisz w środku, można również uzyskać:Lub tak:
źródło
utils\__init__.py
iutils\myfile.py
. (Narzędzia zawierają oba pliki) W ten sposób próbuję zaimportowaćfrom utils.myfile import myMethod
. Ale rozumiemModuleNotFoundError: No module named 'utils'
. Co może być nie tak? PS: UżywamDjango
i próbuję zaimportować, wviews.py
którym jest na tym samym poziomie coutils
folderPYTHONPATH=. python path/to/program.py
Czy twój katalog lib zawiera
__init__.py
plik?Python używa
__init__.py
do określenia, czy katalog jest modułem.źródło
Spróbować
import .lib.BoxTime
. Aby uzyskać więcej informacji, przeczytaj o względnym imporcie w PEP 328 .źródło
Robię to, które zasadniczo obejmuje wszystkie przypadki (upewnij się, że masz
__init__.py
w katalogu względnym / path / to / your / lib /):Przykład:
Masz w folderze projektu:
Masz w innym folderze projektu:
Chcesz użyć
/root/anotherproject/utils.py
i wywołać funkcję foo, która jest w nim.Więc piszesz w app.py:
źródło
os.path
, prawdopodobnie chcesz użyćos.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')
zamiast zakodować „/” w konkatenacji ścieżki."../anotherproject"
bezos.path.dirname()
?dirname(realpath(__file__))
, oblicza ścieżkę względem bieżącego katalogu roboczego po uruchomieniu skryptu, a nie względem miejsca, w którym skrypt się znajduje.Utwórz pusty plik
__init__.py
w podkatalogu / lib. I dodaj na początku głównego kodunastępnie
albo lepiej
źródło
Tylko dodatek do tych odpowiedzi.
Jeśli chcesz zaimportować wszystkie pliki ze wszystkich podkatalogów , możesz dodać to do katalogu głównego pliku.
Następnie możesz po prostu zaimportować pliki z podkatalogów, tak jakby te pliki znajdowały się w bieżącym katalogu.
Przykład roboczy
Jeśli w moim projekcie mam następujący katalog z podkatalogami ...
Mogę umieścić następujący kod w moim
a.py
plikuInnymi słowy, kod ten wyodrębni z którego katalogu pochodzi plik.
źródło
/project/tester.py
/project/lib/BoxTime.py
utwórz pusty plik
__init__.py
wzdłuż linii, aż dojdziesz do pliku/project/lib/somefolder/BoxTime.py
#lib
-__init__.py
need#somefolder
ma dwa elementy jeden, a katalog o nazwie somefolder zawiera dwa elementyboxtime.py
i__init__.py
źródło
Spróbuj tego:
from lib import BoxTime
źródło