如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
当前回答
这同样有效,而且比使用sys模块简单得多:
with open("C:/yourpath/foobar.py") as f:
eval(f.read())
其他回答
这是相关的政治公众人物:
http://www.python.org/dev/peps/pep-0328/
特别是,假设dirFoo是从dirBar开始的目录。。。
在dirFoo\Foo.py中:
from ..dirBar import Bar
最简单的方法是使用sys.path.append()。
然而,您可能也对imp模块感兴趣。它提供对内部导入功能的访问。
# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file
当您不知道模块的名称时,这可以用于动态加载模块。
我在过去使用过这个来创建应用程序的插件类型接口,用户可以在其中编写带有应用程序特定函数的脚本,然后将脚本放到特定目录中。
此外,这些功能可能有用:
imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)
import mymodule
确保dirBar具有__init__.py文件——这会将一个目录放入Python包中。
相对sys.path示例:
# /lib/my_module.py
# /src/test.py
if __name__ == '__main__' and __package__ is None:
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module
基于这个答案。