如何导入给定相对路径的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())

其他回答

您还可以将子目录添加到Python路径中,以便将其作为普通脚本导入。

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar

添加__init__.py文件:

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

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

import sys
sys.path.append('dirBar')
import 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包下有更多模块,则第二种情况非常有用。

import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule
from .dirBar import Bar

而不是:

from dirBar import Bar

以防安装了另一个dirBar并混淆了foo.py阅读器。