Relative paths in Python Relative paths in Python python python

Relative paths in Python


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

import osdirname = 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 you're looking for. Note that if you're using setuptools, you should probably use its package resources API instead.

UPDATE: I'm 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)?

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

#foo.pyimport osprint os.getcwd()print __file__#in the interactive interpreter>>> import foo/Users/jasonfoo.py#and finally, at the shell:~ % python foo.py/Users/jasonfoo.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,ossys.path.append(os.path.realpath('..'))


As mentioned in the accepted answer

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

I just want to add that

the latter string can't begin with the backslash , infact no string should include a backslash

It should be something like

import osdir = 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