adding directory to sys.path /PYTHONPATH
Asked Answered
C

6

187

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 ?

Comfortable answered 19/4, 2013 at 22:27 Comment(1)
I have tried site module.Estrus
S
290

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.

Stuckey answered 19/4, 2013 at 22:49 Comment(8)
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.6Comfortable
Hey man, this broke my django. Are you sure you mean to tell people to put it at the top?!?!!?Lakieshalakin
@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?Stuckey
For more about how sys.path works, see this answer https://mcmap.net/q/137241/-where-is-python-39-s-sys-path-initialized-fromHandbook
just a side note: sys.path is zero-indexed as any list, so it should be sys.path.insert(0, '/path/to/mod_directory')Officer
@V.K.Thanks for noticing that after all this time! Fixed.Stuckey
You really should use "1" instead of "0"! Otherwise you break sys.path. See also https://mcmap.net/q/137242/-why-use-sys-path-append-path-instead-of-sys-path-insert-1-path/125507.Metope
Please read the end of the answer: this change to sys.path is only for the running Python program.Thilda
A
18

You could use:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Actinon answered 5/8, 2017 at 12:47 Comment(1)
you need ';' in windows.Lanitalank
F
12

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

Foochow answered 16/7, 2018 at 8:47 Comment(2)
The simplest is the best answer, add this for development will make the autocomplete workJesus
I have updated the .bashrc as explained above but did not reflect in the jupyter notebook. Jupyter notebook still says module not found.Arnettearney
M
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
Mert answered 23/2, 2018 at 16:19 Comment(0)
D
1

Temporarily changing dirs works well for importing:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)
Drudge answered 16/2, 2018 at 16:19 Comment(1)
This doesn't seem to work; fails here on Python 3.8.11 with No module named '<module>'.Haver
A
0
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.

Anatole answered 6/3, 2024 at 9:59 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.