所以我以这种方式考虑过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之间不同的导入标准和语法感到困惑。您也可以向我确认这是一种可接受的方式吗?还有其他想法吗?
全部谢谢!
答案 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提供了一些解决方案,它们可能会有所帮助。
希望这有帮助。