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

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

下面是一个视觉表示:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

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


当前回答

称我过于谨慎,但我喜欢让我的更便携,因为假设文件总是在每台计算机上的同一位置是不安全的。就我个人而言,我让代码先查找文件路径。我使用Linux,所以我的看起来像这样:

import os, sys
from subprocess import Popen, PIPE
try:
    path = Popen("find / -name 'file' -type f", shell=True, stdout=PIPE).stdout.read().splitlines()[0]
    if not sys.path.__contains__(path):
        sys.path.append(path)
except IndexError:
    raise RuntimeError("You must have FILE to run this program!")

当然,除非你打算把这些包装在一起。但如果是这样的话,你实际上不需要两个单独的文件。

其他回答

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

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

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

在dirFoo\Foo.py中:

from ..dirBar import Bar
from .dirBar import Bar

而不是:

from dirBar import Bar

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

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

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

#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文件。

只需使用:从Desktop.filename导入一些内容

例子:

给定目录中的文件名为test.py用户/用户/桌面,并将导入所有内容。

代码:

from Desktop.test import *

但请确保在该目录中创建一个名为“__init__.py”的空文件