Er zijn twee mappen op mijn bureaublad, DIR1
en DIR2
die de volgende bestanden bevatten:
DIR1:
file1.py
DIR2:
file2.py myfile.txt
De bestanden bevatten het volgende:
bestand1.py
import sys
sys.path.append('.')
sys.path.append('../DIR2')
import file2
file2.py
import sys
sys.path.append( '.' )
sys.path.append( '../DIR2' )
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
mijnbestand.txt
some text
Er zijn nu twee scenario’s. De eerste werkt, de tweede geeft een foutmelding.
Scenario 1
Ik cd
in DIR2
en voer file2.py
uit en het werkt zonder problemen.
Scenario 2
Ik cd
in DIR1
en voer file1.py
uit en het geeft een foutmelding:
Traceback (most recent call last):
File "<absolute-path>/DIR1/file1.py", line 6, in <module>
import file2
File "../DIR2/file2.py", line 9, in <module>
myfile = open(MY_FILE)
IOError: [Errno 2] No such file or directory: 'myfile.txt'
Voor mij slaat dit echter nergens op, aangezien ik het pad naar file1.py
heb toegevoegd met het commando sys.path.append('../DIR2')
.
Waarom gebeurt dit wanneer file1.py
, wanneer file2.py
zich in dezelfde map bevindt als myfile.txt
en toch een fout? Bedankt.
Antwoord 1, autoriteit 100%
Je kunt een pad maken ten opzichte van een module door het __file__
-attribuut van een module te gebruiken. Bijvoorbeeld:
myfile = open(os.path.join(
os.path.dirname(__file__),
MY_FILE))
Dit zou moeten doen wat je wilt, ongeacht waar je je script begint.
Antwoord 2, autoriteit 13%
Vervang
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
met
MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE)
Dat is waar de opmerkingen in uw vraag naar verwijzen als de relatieve padoplossing. Dit veronderstelt dat je het uitvoert vanuit de dir-map van myfile.txt… dus niet ideaal.
Als je weet dat my_file.txt altijd in dezelfde map zal staan als file2.py, dan kun je zoiets proberen in file2..
from os import path
fname = path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)