204

I am trying to import a module from a particular directory.

The problem is that if I use sys.path.append(mod_directory) to append the path and then open the python interpreter, the directory mod_directory gets added to the end of the list sys.path. If I export the PYTHONPATH variable before opening the python interpreter, the directory gets added to the start of the list. In the latter case I can import the module but in the former, I cannot.

Can somebody explain why this is happening and give me a solution to add the mod_directory to the start, inside a python script ?

2
  • 1
    I have tried site module. Commented Sep 17, 2017 at 7:27
  • The question I would ask is why do you want to do this. If your import machine is not working correctly, is there a way that you can fix it, rather than resorting to modifying the PYTHONPATH, something which is essentially a hack. Commented Jun 30, 2024 at 19:27

6 Answers 6

317

This is working as documented. Any paths specified in PYTHONPATH are documented as normally coming after the working directory but before the standard interpreter-supplied paths. sys.path.append() appends to the existing path. See here and here. If you want a particular directory to come first, simply insert it at the head of sys.path:

import sys
sys.path.insert(0,'/path/to/mod_directory')

That said, there are usually better ways to manage imports than either using PYTHONPATH or manipulating sys.path directly. See, for example, the answers to this question.

Sign up to request clarification or add additional context in comments.

8 Comments

thanks for the reply. The problem was that I didn't realize that to add module packaged as a .egg file you have to include the filename instead of just the directory in python 2.6
Hey man, this broke my django. Are you sure you mean to tell people to put it at the top?!?!!?
@RClaven, sorry, it's hard to tell what action and results you are referring to: "put it at the top" and "broke my django" aren't very precise. Can you elaborate?
just a side note: sys.path is zero-indexed as any list, so it should be sys.path.insert(0, '/path/to/mod_directory')
You really should use "1" instead of "0"! Otherwise you break sys.path. See also stackoverflow.com/q/10095037/125507.
|
21

You could use:

    import os
    path = 'the path you want'
    os.environ['PATH'] += os.pathsep + path

2 Comments

you need ';' in windows.
Just use os.pathsep instead of ':' or ';'.
13

As to me, i need to caffe to my python path. I can add it's path to the file /home/xy/.bashrc by add

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH

to my /home/xy/.bashrc file.

But when I use pycharm, the path is still not in.

So I can add path to PYTHONPATH variable, by run -> edit Configuration.

enter image description here

2 Comments

The simplest is the best answer, add this for development will make the autocomplete work
I have updated the .bashrc as explained above but did not reflect in the jupyter notebook. Jupyter notebook still says module not found.
3
import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

is a general approach to add folder where the script is placed into syspath. Helps with Python 3 if you are running script from different places but still want imports to work.

Comments

2

When running a Python script from Powershell under Windows, this should work:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py

Comments

1

Temporarily changing dirs works well for importing:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)

2 Comments

This doesn't seem to work; fails here on Python 3.8.11 with No module named '<module>'.
You need to replace <module> with the module name you are trying to import

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.