导入python模块不在路径上

Import python module NOT on path

我有一个模块foo,包含util.py和bar.py。

我想在空闲或Python会话中导入它。我该怎么办?

我找不到有关如何导入不在当前目录或默认python路径中的模块的文档。在尝试过import"/foo/util.py"之后,和from"" import util

我能得到的最接近的是

1
2
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')

这给了我在Windows7上被拒绝的许可。


一种方法是简单地修改你的路径:

1
2
3
import sys
sys.path.append('C:/full/path')
from foo import util,bar

注意,这要求foo是一个python包,即包含一个__init__.py文件。如果不想修改sys.path,也可以修改PYTHONPATH环境变量或在系统上安装模块。注意,这意味着该目录中的其他目录或.py文件可能会意外加载。

因此,您可能希望使用imp.load_source。它需要文件名,而不是目录(当前用户可以读取的文件):

1
2
import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')


您可以使用PYTHONPATH环境变量自定义模块搜索路径,或者手动修改sys.path目录列表。

请参见python.org上的模块搜索路径文档。


试一试

1
2
3
import sys
sys.path.append('c:/.../dir/dir2')
import foo


根据Phihag的提示,我有这个解决方案。只需将源文件的路径提供给load_src,它就会加载它。您还必须提供一个名称,以便可以使用此名称导入此模块。我更喜欢这样做,因为它更明确:

1
2
3
4
5
6
7
8
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()

另一种(不太明确)方法是:

1
2
3
util = load_src("util","../util.py")    #"import util" is implied here

print util.method()    # works, util was imported by the previous line

编辑:重写方法使其更清晰。