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

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

下面是一个视觉表示:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo希望包含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']

其他回答

这是相关的政治公众人物:

http://www.python.org/dev/peps/pep-0328/

特别是,假设dirFoo是从dirBar开始的目录。。。

在dirFoo\Foo.py中:

from ..dirBar import Bar

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

假设您有一个目录,如:

lib/abc.py

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

__init__.py

然后使用

from lib.abc import <Your Module name>

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

这同样有效,而且比使用sys模块简单得多:

with open("C:/yourpath/foobar.py") as f:
    eval(f.read())

在我看来,最好的选择是将__init__.py放在文件夹中,并使用

from dirBar.Bar import *

不建议使用sys.path.append(),因为如果使用与现有python包相同的文件名,可能会出现问题。我还没有测试过,但这将是模棱两可的。

另一个解决方案是安装py-require包,然后在Foo.py中使用以下内容

import require
Bar = require('./dirBar/Bar')