How to import files in python using sys.path.append?

makansij picture makansij · Aug 27, 2015 · Viewed 85k times · Source

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:

file1.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) 

myfile.txt

some text

Now, there are two scenarios. The first works, the second gives an error.

Scenario 1

I cd into DIR2 and run file2.py and it runs no problem.

Scenario 2

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.

Answer

larsks picture larsks · Aug 27, 2015

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.