Relative paths in Python

Relative paths in Python

In the file that has the script, you want to do something like this:

import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, relative/path/to/file/you/want)

This will give you the absolute path to the file youre looking for. Note that if youre using setuptools, you should probably use its package resources API instead.

UPDATE: Im responding to a comment here so I can paste a code sample. 🙂

Am I correct in thinking that __file__ is not always available (e.g. when you run the file directly rather than importing it)?

Im assuming you mean the __main__ script when you mention running the file directly. If so, that doesnt appear to be the case on my system (python 2.5.1 on OS X 10.5.7):

#foo.py
import os
print os.getcwd()
print __file__

#in the interactive interpreter
>>> import foo
/Users/jason
foo.py

#and finally, at the shell:
~ % python foo.py
/Users/jason
foo.py

However, I do know that there are some quirks with __file__ on C extensions. For example, I can do this on my Mac:

>>> import collections #note that collections is a C extension in Python 2.5
>>> collections.__file__
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-
dynload/collections.so

However, this raises an exception on my Windows machine.

you need os.path.realpath (sample below adds the parent directory to your path)

import sys,os
sys.path.append(os.path.realpath(..))

Relative paths in Python

As mentioned in the accepted answer

import os
dir = os.path.dirname(__file__)
filename = os.path.join(dir, /relative/path/to/file/you/want)

I just want to add that

the latter string cant begin with the backslash , infact no string
should include a backslash

It should be something like

import os
dir = os.path.dirname(__file__)
filename = os.path.join(dir, relative,path,to,file,you,want)

The accepted answer can be misleading in some cases , please refer to this link for details

Leave a Reply

Your email address will not be published. Required fields are marked *