Ik ben een pakket aan het ontwikkelen/testen in mijn lokale directory. Ik wil het importeren in de interpreter (v2.5), maar sys.path bevat niet de huidige map. Op dit moment typ ik sys.path.insert(0,'.')
. Is er een betere manier?
Ook
from . import mypackage
mislukt met deze fout:
ValueError: Attempted relative import in non-package
Antwoord 1, autoriteit 100%
Je kunt relatieve imports alleen gebruiken van in een module die op zijn beurt is geïmporteerd als onderdeel van een pakket — je script of interactieve interpreter was dat niet, dus natuurlijk from . import
(wat betekent “importeren uit hetzelfde pakket waaruit ik geïmporteerd ben”) werkt niet. import mypackage
zal in orde zijn als je ervoor zorgt dat de bovenliggende map van mypackage
zich in sys.path
bevindt (hoe je erin geslaagd bent om je huidige map wegvan sys.path
Ik weet het niet — heb je iets vreemds in site.py, of…?)
Om je huidige directory weer in sys.path
te krijgen, is er eigenlijk geen betere manier dan hem daar te plaatsen.
Antwoord 2, autoriteit 38%
Zie de documentatie voor sys.path:
http://docs.python.org/library/sys.html# sys.path
Om te citeren:
Als de scriptmap niet beschikbaar is (bijvoorbeeld als de interpreter interactief wordt aangeroepen of als het script wordt gelezen vanuit standaardinvoer), is path[0] de lege tekenreeks, die Python eerst naar modules in de huidige map stuurt.
Het is dus niet nodig om sys.path te gebruiken als je de python-interpreter start vanuit de map die je module bevat.
Als u uw pakket wilt importeren, doet u het volgende:
import mypackage
Aangezien de map die het pakket bevat al in sys.path staat, zou het goed moeten werken.
Antwoord 3, autoriteit 38%
Houd het simpel:
try:
from . import mymodule # "myapp" case
except:
import mymodule # "__main__" case
Antwoord 4, autoriteit 33%
Als u een ongewijzigd python-script wilt uitvoeren zodat het bibliotheken importeert uit een specifieke lokale map, kunt u de omgevingsvariabele PYTHONPATH
instellen – b.v. in bash:
export PYTHONPATH=/home/user/my_libs
python myscript.py
Als je het gewoon uit de huidige werkmap wilt importeren, gebruik dan de .
notatie:
export PYTHONPATH=.
python myscript.py
Antwoord 5, autoriteit 23%
In een pakket als er setup.pyis, is het beter om het te installeren
pip install -e .
Antwoord 6, autoriteit 10%
Een eenvoudige manier om het te laten werken, is door uw script uit te voeren vanuit de bovenliggende map met behulp van de vlag -m
van python, b.v. python -m packagename.scriptname
. Uiteraard heb je in deze situatie een __init__.py
bestand nodig om van je directory een pakket te maken.
Antwoord 7, autoriteit 8%
Een beetje laat op het feest, maar dit werkte voor mij:
>>> import sys
>>> sys.path.insert(0, '')
Blijkbaar, als er een lege string is, weet Python dat deze in de huidige directory moet zoeken. Ik had geen lege string in sys.path
, wat deze fout veroorzaakte.
Antwoord 8, autoriteit 6%
Het gebruik van sys.path
zou de huidige map al moeten bevatten.
Probeer:
import .
of:
from . import sth
het kan echter geen goede gewoonte zijn, dus waarom niet gewoon gebruiken:
import mypackage
Antwoord 9, autoriteit 6%
Ik heb pathlib
gebruikt om mijn modulemap aan mijn systeempad toe te voegen, omdat ik de module niet als pakket wilde installeren en het antwoord van @maninthecomputer werkte niet voor mij
import sys
from pathlib import Path
cwd = str(Path(__file__).parent)
sys.path.insert(0, cwd)
from my_module import my_function
Antwoord 10
Sprekend voor python3.. Ik wilde een verbeterde versie gebruiken van een bibliotheek die in mijn omgeving is geïnstalleerd. Er zijn enkele extra afdrukinstructies die het maakt om aan te tonen dat het en niet de originele lib wordt gebruikt.
Ik heb de map van de lib naast het python-script geplaatst. Voer het script uit.. het liep met de lokale lib met de aanpassingen.
De map verwijderd en opnieuw uitgevoerd – deze keer liep het met de geïnstalleerde lib.
De oplossing was dus simpel: plaats de map van de lib (met dezelfde naam als in je importstatement) in je projectmap. Dat doet zijn werk, althans aan mijn kant.
Dit is op een standaard Linux Mint 20.04-systeem, met een python 3.8 virtuele omgeving geactiveerd (dus “(py3.8)” verschijnt in mijn terminal wanneer ik in de virtuele omgeving ben)