Import python module NOT on path
PythonImportExternalPython ModulePython Problem Overview
I have a module foo, containing util.py and bar.py.
I want to import it in IDLE or python session. How do I go about this?
I could find no documentation on how to import modules not in the current directory or the default python PATH.
After trying import "<full path>/foo/util.py"
,
and from "<full path>" import util
The closest I could get was
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')
Which gave me Permission denied on windows 7.
Python Solutions
Solution 1 - Python
One way is to simply amend your http://docs.python.org/library/sys.html#sys.path">path</a>;:
import sys
sys.path.append('C:/full/path')
from foo import util,bar
Note that this requires foo to be a python package, i.e. contain a __init__.py
file. If you don't want to modify sys.path
, you can http://docs.python.org/tutorial/modules.html#the-module-search-path">also modify the PYTHONPATH
environment variable or http://docs.python.org/install/index.html">install the module on your system. Beware that this means that other directories or .py
files in that directory may be loaded inadvertently.
Therefore, you may want to use http://docs.python.org/library/imp.html#imp.load_source">`imp.load_source`</a> instead. It needs the filename, not a directory (to a file which the current user is allowed to read):
import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')
Solution 2 - Python
You could customize the module search path using the PYTHONPATH
environment variable, or manually modify the sys.path
directory list.
See Module Search Path documentation on python.org.
Solution 3 - Python
Give this a try
import sys
sys.path.append('c:/.../dir/dir2')
import foo
Solution 4 - Python
Following phihag's tip, I have this solution. Just give the path of a source file to load_src
and it will load it. You must also provide a name, so you can import this module using this name. I prefer to do it this way because it's more explicit:
def load_src(name, fpath):
import os, imp
return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath))
load_src("util", "../util.py")
import util
print util.method()
Another (less explicit) way is this:
util = load_src("util", "../util.py") # "import util" is implied here
print util.method() # works, util was imported by the previous line
Edit: the method is rewritten to make it clearer.