Import python module NOT on path

PythonImportExternalPython Module

Python 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVort3xView Question on Stackoverflow
Solution 1 - PythonphihagView Answer on Stackoverflow
Solution 2 - PythonicecrimeView Answer on Stackoverflow
Solution 3 - PythonLevonView Answer on Stackoverflow
Solution 4 - PythonJabbaView Answer on Stackoverflow