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

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

下面是一个视觉表示:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

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


当前回答

在本例中,要将Bar.py导入Foo.py,首先我会将这些文件夹转换为Python包,如下所示:

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

然后我会在Foo.py中这样做:

from .dirBar import Bar

如果我希望名字空间看起来像Bar.whatever,或者

from . import dirBar

如果我想要名称空间dirBar.Bar.whatever。如果您在dirBar包下有更多模块,则第二种情况非常有用。

其他回答

如果您以这种方式构建项目:

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

然后,从Foo.py你应该能够做到:

import dirFoo.Foo

Or:

from dirFoo.Foo import FooObject

根据Tom的评论,这确实需要通过site_packages或搜索路径访问src文件夹。此外,正如他所提到的,__init__.py是在您第一次导入该包/目录中的模块时隐式导入的。通常__init__.py只是一个空文件。

这同样有效,而且比使用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

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

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

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

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

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