【问题标题】:Importing From Sister Subdirectories in Python?从 Python 中的姐妹子目录导入?
【发布时间】:2013-05-03 14:39:58
【问题描述】:

所以,我在 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 是脚本(当每个分别正在导入 - 未导入时)?

【问题讨论】:

    标签: python import


    【解决方案1】:

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

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

    【讨论】:

    • 我可以编辑 PYTHONPATH,但是否有标准的方法来执行此操作?我不希望 repo 的所有新用户都必须手动进入并更新他们的 PYTHONPATH。
    • 如果您不希望人们必须自己管理PYTHONPATH,那么您可能需要考虑sys.path 重整。 (例如,使用__file__ 加上os.abspath 查找脚本所在的位置,然后将目录的正确级别数设为repo 的父级,然后sys.path.insert 它。)跨度>
    【解决方案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
    

    更多信息:

    【讨论】:

    • 我真的希望这些相对导入工作。但是,在我的 python 2.7 上,它们不起作用。
    • 使用 Python 2.7,我成功使用了 from sub2.mod2 import thing 之类的语句。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2015-07-23
      • 2017-03-18
      • 1970-01-01
      • 2015-03-06
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多