【问题标题】:Python 2 relative imports: two different packages needs a common classPython 2 相对导入:两个不同的包需要一个公共类
【发布时间】:2017-03-07 14:14:52
【问题描述】:

所以我在 Python 2.7 项目中考虑过这种方式。它将由两个独立的部分组成,需要第三个包中的公共类(模块)文件:

SomeRootFolder/Package1Folder/manyPythonModuleFiles.py
SomeRootFolder/Package2Folder/manyPythonModuleFiles.py
SomeRootFolder/SharedPackageFolder/OneCommonClassNeedsToBeShared.py

我要做的是从两个包中导入共享包中的公共类。前两个包不需要交互,但需要一个类。 python 程序可能会在从两个包文件夹本身打开的控制台中运行,例如:

cd Package1Folder
python SomeMainFile.py

如果更简单,Python 调用可能类似于python Package1Folder/SomeMainFile.py,但我需要对此进行计划。

您能否提供我如何从包 1 或 2 对第三个共享包中的文件进行相对导入?我需要 SomeRootFolder 文件夹中的__init__.py 文件吗?我总是对相对导入以及 Python 2 和 3 之间不同的导入标准和语法感到困惑。您能否向我证实这是一种可以接受的继续方式?还有其他想法吗?

谢谢大家!

【问题讨论】:

    标签: python python-2.7 oop module package


    【解决方案1】:

    如果你想使用相对导入,你需要__init__.pySharedPackageFolder文件夹中,你可以使用它来导入OneCommonClassNeedsToBeShared.py

    from ..SharedPackageFolder import OneCommonClassNeedsToBeShared
    

    查看有关Rationale for Relative Imports 的更多详细信息。

    随着转向绝对进口,问题出现了 应该允许相对进口。几个用例是 呈现,其中最重要的是能够重新排列 大包的结构,而无需编辑子包。在 另外,包内的模块不能轻易地导入自身 相对进口。

    您也可以使用绝对导入,不再强烈反对相对导入,强烈建议在某些情况下使用 absolute_import。

    您需要确保SomeRootFolder 在您的PYTHONPATH 中,或者将此文件夹设为源根目录,这样您在大型项目中导入包或脚本会更容易,但有时您应该小心绝对导入.

    from SharedPackageFolder import OneCommonClassNeedsToBeShared.py
    

    绝对导入。从 PEP 8:

    强烈建议不要使用包内导入的相对导入。始终对所有导入使用绝对包路径。即使是现在 PEP 328 [7] 在 Python 2.5 中完全实现,其显式风格 积极劝阻相对进口;绝对进口更多 便携且通常更具可读性。

    顺便说一句,Python 3 中的相对导入可能会返回SystemError,请查看问题:Relative imports in Python 3。 @vaultah 提供了一些解决方案,它们可能会有所帮助。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多