Python 2相对导入:两个不同的包需要一个公共类

时间:2017-03-07 05:24:30

标签: python python-2.7 oop module package

所以我以这种方式考虑过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之间不同的导入标准和语法感到困惑。您也可以向我确认这是一种可接受的方式吗?还有其他想法吗?

全部谢谢!

1 个答案:

答案 0 :(得分:2)

如果您想使用相对导入,则__init__.py文件夹中需要SharedPackageFolder,您可以使用此导入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提供了一些解决方案,它们可能会有所帮助。

希望这有帮助。