Importeer python-pakket van lokale map naar interpreter

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 mypackagezal in orde zijn als je ervoor zorgt dat de bovenliggende map van mypackagezich in sys.pathbevindt (hoe je erin geslaagd bent om je huidige map wegvan sys.pathIk weet het niet — heb je iets vreemds in site.py, of…?)

Om je huidige directory weer in sys.pathte 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 PYTHONPATHinstellen – 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 -mvan python, b.v. python -m packagename.scriptname. Uiteraard heb je in deze situatie een __init__.pybestand 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.pathzou 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 pathlibgebruikt 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)

Other episodes