我有一个模块foo,包含util.py和bar.py。
我想在IDLE或python会话中导入它。我该怎么做?
我找不到有关如何导入不在当前目录或默认python PATH中的模块的文档。
尝试import "<full path>/foo/util.py"
后,
和from "<full path>" import util
我能得到的最接近的是
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')
这让我在Windows 7上拒绝了权限。
答案 0 :(得分:66)
一种方法是简单地修改path:
import sys
sys.path.append('C:/full/path')
from foo import util,bar
请注意,这需要foo成为python包,即包含__init__.py
文件。如果您不想修改sys.path
,可以also modify the PYTHONPATH
environment variable或install the module on your system。请注意,这意味着可能会无意中加载该目录中的其他目录或.py
文件。
因此,您可能希望使用imp.load_source
。它需要文件名,而不是目录(允许当前用户读取的文件):
import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')
答案 1 :(得分:5)
您可以使用PYTHONPATH
环境变量自定义模块搜索路径,也可以手动修改sys.path
目录列表。
请参阅python.org上的Module Search Path文档。
答案 2 :(得分:2)
试一试
import sys
sys.path.append('c:/.../dir/dir2')
import foo
答案 3 :(得分:1)
按照phihag的提示,我有这个解决方案。只需将源文件的路径指定给load_src
,它就会加载它。您还必须提供名称,以便可以使用此名称导入此模块。我更喜欢这样做,因为它更明确:
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()
另一种(不那么明确)的方式是:
util = load_src("util", "../util.py") # "import util" is implied here
print util.method() # works, util was imported by the previous line
编辑:重写方法以使其更清晰。