Struggling to append a relative path to my sys.path

user2564502 picture user2564502 · Jan 21, 2014 · Viewed 32.5k times · Source

So there are a lot of pretty similar questions but none of the answers seems to satisfy what I'm looking for.

Essentially I am running a python script using an absolute directory in the command line.
Within this file itself, I want to import a module/file,I currently use an absolute path to do this (sys.path.append(/....).
But I would like to use a relative path, relative to the script itself.
All I seem to be able to do is append a path relative to my present working directory.

How do I do this?

Answer

oHo picture oHo · Feb 7, 2016

The two below alternate possibilities apply to both Python versions 2 and 3. Choose the way you prefer. All use cases are covered.

Example 1

main script:      /some/path/foo/foo.py
module to import: /some/path/foo/bar/sub/dir/mymodule.py

Add in foo.py

import sys, os
sys.path.append(os.path.join(sys.path[0],'bar','sub','dir'))
from mymodule import MyModule

Example 2

main script:      /some/path/work/foo/foo.py
module to import: /some/path/work/bar/mymodule.py

Add in foo.py

import sys, os
sys.path.append(os.path.join(os.path.dirname(sys.path[0]),'bar'))
from mymodule import MyModule

Explanations

  • sys.path[0] is /some/path/foo in both examples
  • os.path.join('a','b','c') is more portable than 'a/b/c'
  • os.path.dirname(mydir) is more portable than os.path.join(mydir,'..')

See also

Documentation about importing modules: