2017-03-07 70 views
0

所以我对Python 2.7项目这样想。这将是由需要一个通用类(模块)的文件中第三包两个独立的部分:Python 2相对导入:两个不同的包需要一个普通的类

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

我想要做的是导入从两个包共享包的通用类。两个第一包不需要一起交互,但需要一个类。蟒蛇程序可能会从内部两包文件夹本身打开控制台拼命地跑,如:

cd Package1Folder 
python SomeMainFile.py 

如果是比较容易,Python的通话也能像python Package1Folder/SomeMainFile.py但我需要计划这一点。

您能否提供如何从第一个包或第二个包中获取第三个共享包中的文件的相对导入?我需要在SomeRootFolder文件夹中输入__init__.py文件吗?我总是对相关导入以及Python 2和3之间的导入标准和语法感到困惑。您是否也可以向我证实这是一种可以接受的方式?任何其他想法?

谢谢大家!

回答

2

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

from ..SharedPackageFolder import OneCommonClassNeedsToBeShared 

查看有关Rationale for Relative Imports更多细节。

随着绝对进口的转变,出现了问题是否应允许 相对进口。提出了几种使用案例 ,其中最重要的是能够重新排列大包装的结构而不必编辑子包装。另外, 另外,如果没有 相对导入,包内的模块不能轻易导入。你

也可以使用绝对进口,相对进口不再极力劝阻,使用absolute_import在某些情况下,强烈建议。

您需要确保SomeRootFolder位于您的PYTHONPATH中,或者将此文件夹设置为sources root,您可以更轻松地在大型项目中导入包或脚本,但有时您应该小心绝对导入。

from SharedPackageFolder import OneCommonClassNeedsToBeShared.py 

绝对进口。来自PEP 8:

对于包装内进口的相对进口非常不鼓励。对所有导入始终使用绝对包路径。即使在Python 2.5中完全实现了 PEP 328 [7],它的样式显式 相对导入也被阻止;绝对进口更便携,通常更具可读性。

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

希望这会有所帮助。

相关问题