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

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

下面是一个视觉表示:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

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


当前回答

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

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

其他回答

确保dirBar具有__init__.py文件——这会将一个目录放入Python包中。

称我过于谨慎,但我喜欢让我的更便携,因为假设文件总是在每台计算机上的同一位置是不安全的。就我个人而言,我让代码先查找文件路径。我使用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!")

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

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

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只是一个空文件。

在本例中,要将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包下有更多模块,则第二种情况非常有用。

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

例子:

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

代码:

from Desktop.test import *

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