Rozwijam / testuję pakiet w moim katalogu lokalnym. Chcę go zaimportować do interpretera (v2.5), ale sys.path nie zawiera bieżącego katalogu. Teraz wpisuję sys.path.insert(0,'.')
. Czy jest lepszy sposób?
Również,
from . import mypackage
kończy się niepowodzeniem z tym błędem:
ValueError: Attempted relative import in non-package
Odpowiedzi:
Możesz użyć importu względnego tylko z modułu, który z kolei został zaimportowany jako część pakietu - twój skrypt lub interaktywny interpreter nie był, więc oczywiście
from . import
(co oznacza "import z tego samego pakietu, z którego zostałem zaimportowany") nie nie działa.import mypackage
będzie dobrze raz upewnić katalogu nadrzędnegomypackage
jestsys.path
(jak udało Ci się aktualny katalog z dala odsys.path
nie wiem - czy masz coś dziwnego w site.py, albo ...)sys.path
Nie ma lepszego sposobu na przywrócenie tam obecnego katalogu niż umieszczenie go tam.źródło
Zobacz dokumentację sys.path:
http://docs.python.org/library/sys.html#sys.path
Cytować:
Więc nie ma potrzeby małpowania z sys.path, jeśli uruchamiasz interpreter Pythona z katalogu zawierającego twój moduł.
Aby zaimportować pakiet, po prostu wykonaj:
import mypackage
Ponieważ katalog zawierający pakiet jest już w sys.path, powinien działać dobrze.
źródło
sys.path
więc pliki w nim zawarte powinny znajdować się przed plikami w innym miejscu w środowisku roboczym.sys.path.insert(0, new_path)
raczej niżsys.path.append(new_path)
.Jeśli chcesz uruchomić niezmodyfikowany skrypt w Pythonie, aby importował biblioteki z określonego katalogu lokalnego, możesz ustawić
PYTHONPATH
zmienną środowiskową - np. W bash:Jeśli chcesz po prostu zaimportować z bieżącego katalogu roboczego, użyj
.
notacji:źródło
Nie komplikuj:
try: from . import mymodule # "myapp" case except: import mymodule # "__main__" case
źródło
Prostym sposobem, aby to działało, jest uruchomienie skryptu z katalogu nadrzędnego za pomocą
-m
flagi Pythona , nppython -m packagename.scriptname
. Oczywiście w tej sytuacji potrzebujesz__init__.py
pliku, aby zamienić katalog w pakiet.źródło
W pakiecie, jeśli jest setup.py , lepiej go zainstalować
źródło
Użycie
sys.path
powinno już zawierać bieżący katalog.Próbować:
import .
lub:
from . import sth
jednak może to nie być dobra praktyka, więc dlaczego nie użyć po prostu:
import mypackage
źródło
Trochę za późno na imprezę, ale tak mi się udało:
>>> import sys >>> sys.path.insert(0, '')
Najwyraźniej, jeśli istnieje pusty ciąg, Python wie, że powinien on szukać w bieżącym katalogu. Nie miałem pustego ciągu
sys.path
, co spowodowało ten błąd.źródło
Kiedyś
pathlib
, aby dodać mój katalog modułu do mojej ścieżce systemowej, jak chciałem, aby uniknąć instalowania modułu jako pakiet i @maninthecomputer odpowiedzi nie działa dla mnieimport sys from pathlib import Path cwd = str(Path(__file__).parent) sys.path.insert(0, cwd) from my_module import my_function
źródło