10

因此,我在 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 是否是脚本(当每个分别正在导入 - 不被导入时)?

4

3 回答 3

6

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

如果您希望它涵盖您将两个 python 文件作为脚本直接从任意目录调用的情况,那么任何其他解决方案都将涉及一些黑客行为 - 很可能会sys.path修改以有效地完成与设置相同的事情PYTHONPATH,但不必拥有用户设置它。

于 2013-05-03T06:26:01.317 回答
3

如果您使用的是 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

更多信息:

于 2013-05-03T06:29:07.920 回答
0

脚本或模块可以导入以下模块

  1. 在系统路径上,或
  2. 与导入脚本/模块相同的包的一部分。

对于模块,这些规则无一例外地适用。对于脚本,规则适用,但问题是默认情况下,当您运行脚本时,它不被视为包的一部分。

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

如果你想让一个包中的脚本“知道”,你可以给它一个__package__属性。请参阅上一个问题from ...sub2 import mod2然后,您通常可以在该脚本中使用显式相对导入(例如, )。

于 2013-05-03T06:39:58.987 回答