从python的子目录链接导入



我正在使用别人的项目添加一些功能到我的,有一个python脚本我想导入。问题是他们目录的导入结构:我把他们的项目目录放在我的主项目下的子文件夹中(需要留在那里,这样我就可以让他们的项目远离我的版本控制),它看起来像这样:

myproject/
  myscript.py
  theirproject/
    __init__.py
    baz.py
    secondlayer/
      __init__.py
      all.py
      foo.py
      bar.py

all.py只是一个import语句列表,用于从第二层目录导入额外的脚本,如下所示:

from secondlayer.foo import *
from secondlayer.bar import * #etc

我想导入:

from theirproject.secondlayer.all import *

但是当python报错"no module named secondlayer.foo"时失败我还尝试了以下操作:

from theirproject.secondlayer import all

我可以得到它的工作,当我把我的脚本在theirproject/和导入所有没有"theirproject"前缀,但我真的不能有它是那样的。我可以通过单独导入foo, bar等来进一步完成导入过程,如下所示:

from theirproject.secondlayer import foo
from theirproject.secondlayer import bar #etc

但是这些脚本无法从与第二层相同级别的其他脚本(如bazz .py)导入更多内容,所以我卡住了。

在python 2.7.6中正确的方法是什么?

如果你改变

from secondlayer.foo import *
from secondlayer.bar import *

到像这样的用户相对导入

from .foo import *
from .bar import *

或者像这样

from foo import *
from bar import *

此外,您可以在第二层级别的__init__.py中进行这些导入,以便从myscript.py导入的内容变为

from theirproject.secondlayer.all import *

查看您是否有必要的权限从您的目录及其相应的子目录导入包。

作为参考,你可能会喜欢看这个和它相应的链接问题:

Python导入不能工作

我最终通过将他们的项目/添加到我的PYTHONPATH来解决我的问题。我给junnytony的答案点了赞——它帮我指明了正确的方向,所以谢谢!