【问题标题】:Basic Python imports question基本 Python 导入问题
【发布时间】:2011-06-13 21:02:10
【问题描述】:

如果我有这样的 src 目录设置:

main.py
pkg1:
    __init__.py
    util.py
pkg2:
    __init__.py
    test.py

您能告诉我从main.pytest.py 导入pkg1.util 的最佳方法吗?

谢谢! (如果我需要在根目录下有另一个__init__.py 文件,请告诉我?)

【问题讨论】:

    标签: python import python-3.x


    【解决方案1】:

    由于您提到这是 Python 3,因此您不必将以下内容添加到您的 .py 文件中。我仍然会这样做,因为如果一些坚持使用 Python 2 的可怜的草皮需要使用您的代码,它有助于向后移植:

    from __future__ import absolute_import
    

    鉴于您使用的是 Python 3,或者您使用的是 Python 2 并且已包含上述行,这就是您的答案:

    来自main.py

    import pkg1.util as util
    

    test.py 开始,您将使用两种方式之一,具体取决于您是否认为pkg1pkg2 是始终以相同方式相互部署的事物,或者它们是否总是每个都在顶层半独立地部署。如果是第一个,你会这样做:

    from ..pkg1 import util
    

    如果是第二种选择,则:

    import pkg1.util as util
    

    当然,这意味着您总是从 main.py 所在的目录运行 Python,或者该目录在 PYTHONPATH 中或由于某种原因最终在 sys.path 中(比如成为主要的 Python例如 site-packages 目录)。

    【讨论】:

    • 如果PYPATH 中由于某种原因存在不同的pkg1,我是否仍会使用这两个选项导入this pkg1
    • @aharon:没有任何选项可以保证您将获得预期的pkg1 而不会自己弄乱sys.path 以确保适当的目录位于路径的第一个位置。以这种方式存在冲突的包名称是一个非常糟糕的主意,除非您有一个像 setuptools 这样的包管理系统,它将包作为“命名空间包”进行管理。
    • 这一切不需要__init__pymain.py 在同一目录中吗?实际上,test.pyutil.py 位于完全独立的包中,它们不是普通超级包的子包。
    • @Sven Marnach:当我给出答案时,我假设 main.py 是一个顶级包,它不在任何子包中,但你说得很好。
    【解决方案2】:

    来自 main.py:

    import pkg1.util
    

    来自 test.py:

    from ..pkg1 import util
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2021-02-22
      • 2012-11-02
      相关资源
      最近更新 更多