I have just joined a project with a rather large existing code base. We develop in linux and do not use and IDE. We run through the command line. I'm trying to figure out how to get python to search for the right path when I run project modules. For instance, when I run something like:
python someprojectfile.py
I get
ImportError: no module named core.'somemodule'
I get this for all of my imports to I assume it's an issue with the path.
TLDR:
How do I get Python to search ~/codez/project/
and all the files and folders for *.py files during import statements.
You should also read about python packages here: http://docs.python.org/tutorial/modules.html.
From your example, I would guess that you really have a package at
~/codez/project
. The file__init__.py
in a python directory maps a directory into a namespace. If your subdirectories all have an__init__.py
file, then you only need to add the base directory to yourPYTHONPATH
. For example:In addition to testing your PYTHONPATH environment variable, as David explains, you can test it in python like this:
...
I read this question looking for an answer, and didn't like any of them.
So I wrote a quick and dirty solution. Just put this somewhere on your sys.path, and it'll add any directory under
folder
(from the current working directory), or underabspath
:And I like it because I can have a folder for some random tools and not have them be a part of packages or anything, and still get access to some (or all) of them in a couple lines of code.
There are a few possible ways to do this:
PYTHONPATH
to a colon-separated list of directories to search for imported modules.sys.path.append('/path/to/search')
to add the names of directories you want Python to search for imported modules.sys.path
is just the list of directories Python searches every time it gets asked to import a module, and you can alter it as needed (although I wouldn't recommend removing any of the standard directories!). Any directories you put in the environment variablePYTHONPATH
will be inserted intosys.path
when Python starts up.site.addsitedir
to add a directory tosys.path
. The difference between this and just plain appending is that when you useaddsitedir
, it also looks for.pth
files within that directory and uses them to possibly add additional directories tosys.path
based on the contents of the files. See the documentation for more detail.Which one of these you want to use depends on your situation. Remember that when you distribute your project to other users, they typically install it in such a manner that the Python code files will be automatically detected by Python's importer (i.e. packages are usually installed in the
site-packages
directory), so if you mess withsys.path
in your code, that may be unnecessary and might even have adverse effects when that code runs on another computer. For development, I would venture a guess that settingPYTHONPATH
is usually the best way to go.However, when you're using something that just runs on your own computer (or when you have nonstandard setups, e.g. sometimes in web app frameworks), it's not entirely uncommon to do something like
The easiest way I find is to create a file "any_name.pth" and put it in your folder "\Lib\site-packages". You should find that folder wherever python is installed.
In that file, put a list of directories where you want to keep modules for importing. For instance, make a line in that file like this:
C:\Users\example...\example
You will be able to tell it works by running this in python:
You will see your directory printed out, amongst others from where you can also import. Now you can import a "mymodule.py" file that sits in that directory as easily as:
This will not import subfolders. For that you could imagine creating a python script to create a .pth file containing all sub folders of a folder you define. Have it run at startup perhaps.
I know this thread is a bit old, but it took me some time to get to the heart of this, so I wanted to share.
In my project, I had the main script in a parent directory, and, to differentiate the modules, I put all the supporting modules in a sub-folder called "modules". In my main script, I import these modules like this (for a module called report.py):
If I call my main script, this works. HOWEVER, I wanted to test each module by including a
main()
in each, and calling each directly, as:Now Python complains that it can't find "a module called modules". The key here is that, by default, Python includes the folder of the script in its search path, BUT NOT THE CWD. So what this error says, really, is "I can't find a modules subfolder". The is because there is no "modules" subdirectory from the directory where the report.py module resides.
I find that the neatest solution to this is to append the CWD in Python search path by including this at the top:
Now Python searches the CWD (current directory), finds the "modules" sub-folder, and all is well.