There are two directories on my desktop, DIR1
and DIR2
which contain the following files:
DIR1:
file1.py
DIR2:
file2.py myfile.txt
The files contain the following:
import sys
sys.path.append('.')
sys.path.append('../DIR2')
import file2
import sys
sys.path.append( '.' )
sys.path.append( '../DIR2' )
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
some text
Now, there are two scenarios. The first works, the second gives an error.
I cd
into DIR2
and run file2.py
and it runs no problem.
I cd
into DIR1
and run file1.py
and it throws an error:
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'
However, this makes no sense to me, since I have appended the path to file1.py
using the command sys.path.append('../DIR2')
.
Why does this happen when file1.py
, when file2.py
is in the same directory as myfile.txt
yet it throws an error? Thank you.
You can create a path relative to a module by using a module's __file__
attribute. For example:
myfile = open(os.path.join(
os.path.dirname(__file__),
MY_FILE))
This should do what you want regardless of where you start your script.
Replace
MY_FILE = "myfile.txt"
myfile = open(MY_FILE)
with
MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE)
That's what the comments your question has are referring to as the relative path solution. This assumes that you're running it from the dir one up from myfile.txt... so not ideal.
If you know that my_file.txt is always going to be in the same dir as file2.py then you can try something like this in file2..
from os import path
fname = path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.