如何导入给定相对路径的Python模块?

例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?

下面是一个视觉表示:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo希望包含Bar,但重组文件夹层次结构不是一个选项。


当前回答

添加__init__.py文件:

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

然后将以下代码添加到Foo.py的开头:

import sys
sys.path.append('dirBar')
import Bar

其他回答

不修改脚本的最简单方法是设置PYTHONPATH环境变量。因为sys.path是从以下位置初始化的:

包含输入脚本的目录(或当前目录)。PYTHONPATH(目录名列表,与语法作为外壳变量PATH)。依赖于安装的默认值。

只需运行:

export PYTHONPATH=/absolute/path/to/your/module

sys.path将包含上述路径,如下所示:

print sys.path

['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

以下是使用相对路径从上面的一个级别导入文件的方法。

基本上,只需将工作目录向上移动一个级别(或任何相对位置),将其添加到路径中,然后将工作目录移回其起始位置。

#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path =  os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)

只需执行简单的操作,即可从其他文件夹导入.py文件。

假设您有一个目录,如:

lib/abc.py

然后在lib文件夹中保留一个空文件

__init__.py

然后使用

from lib.abc import <Your Module name>

在导入模块层次结构的每个文件夹中保留__init__.py文件。

相对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

基于这个答案。

Linux用户快速而肮脏的方式

如果您只是在修补,而不关心部署问题,则可以使用符号链接(假设您的文件系统支持该链接)使模块或包在请求模块的文件夹中直接可见。

ln -s (path)/module_name.py

or

ln -s (path)/package_name

注意:“模块”是扩展名为.py的任何文件,“包”是包含__init__.py文件(可以是空文件)的任何文件夹。从使用的角度来看,模块和包是相同的——都会根据import命令的请求公开其包含的“定义和语句”。

参见:http://docs.python.org/2/tutorial/modules.html