从Python中的姐妹子目录导入?

时间:2013-05-03 06:19:28

标签: python import

所以,我在Stack Overflow上看到了一些类似的问题,但似乎没有解决我的问题或一般情况。所以,希望这个问题可以解决这个问题,并且让我头痛不已。我有一个形式的git repo:

repo/
   __init__.py
   sub1/
      __init__.py
      sub1a/
         __init.py
         mod1.py
   sub2/
      __init__.py
      mod2.py

如何从mod1.py导入mod2.py,反之亦然,这取决于mod1.py还是mod2.py是脚本(当每个都分别导入 - 未导入时)?

3 个答案:

答案 0 :(得分:6)

最简单的解决方案是将包含repo的目录放在PYTHONPATH中,然后使用绝对路径导入,例如import repo.sub2.mod2等等。

任何其他解决方案都会涉及一些hackery,如果你想要它涵盖你直接调用python文件作为来自任意目录的脚本的情况 - 最有可能sys.path修改以有效地完成同样的事情设置PYTHONPATH,但无需用户设置它。

答案 1 :(得分:2)

如果您使用的是Python 2.6+,则有两种选择:

  • 相对进口
  • repo添加到PYTHONPATH

使用相对导入时,会使用特殊的点语法:

包sub1中的

from .sub2.mod2 import thing
包sub1a中的

from ..sub2.mod2 import otherthing

请注意,普通导入语句(import module)不适用于相对导入。

更好的解决方案是使用绝对导入并正确设置Python路径(例如bash中):

export PYTHONPATH=/where/your/project/is:$PYTHONPATH

更多信息:

答案 2 :(得分:0)

脚本或模块可以导入

模块
  1. 在系统路径上,或
  2. 与导入脚本/模块相同的软件包的一部分。
  3. 对于模块,这些规则无一例外地适用。对于脚本,规则适用,但是在运行脚本时默认情况下,它不被认为是包的一部分。

    这意味着默认情况下,脚本只能导入系统路径上的模块。默认情况下,路径包含当前目录,因此,如果运行脚本,则可以导入同一目录中的模块或子目录中的模块。但就是这样。脚本在目录树中没有“它在哪里”的概念,因此它不能执行任何需要有关封闭目录的特定相对路径信息的导入。这意味着您无法“从父目录”或“从兄弟目录”导入内容。这些目录中的内容只有在系统路径上才能导入。

    如果要使包中的脚本“知道”,可以为其指定__package__属性。见this previous question。然后,您可以在该脚本中使用显式相对导入(例如,from ...sub2 import mod2)。