设置为Python包的顶层

时间:2016-01-28 09:49:00

标签: python python-2.7

我有这个文件夹结构: enter image description here

好的,我的主应用程序(main.py

中有以下代码
from Modules.Core import Core1
print Core1.HouseNumber()

以及Core1.py中的代码:

from ..Engine import Engine1
def HouseNumber():
    house = Engine1.BadLuck()
    return house 

Engine1.py中的此代码:

def BadLuck():
    return 13

这项工作完全没有任何问题,好吧 现在,这里有趣的部分,我在Widget1.py

下面的代码
def door():
    return 'black'

Core2.py中的此代码:

from ...Widgets import Widget1
def DoorColor():
    door = Widget1.door()
    return door

如果我将main.py更改为:

from Modules.Core import Core1, Core2
print Core1.HouseNumber()
print Core2.DoorColor()

我收到此错误:Attempted relative import beyond toplevel package

好的,现在如果我从云端硬盘Main.py中的ProjectX中取出D,并将main.py代码更改为:

from ProjectX.Modules.Core import Core1, Core2
print Core1.HouseNumber()
print Core2.DoorColor()

它完美地工作。
好的,我理解,如果我from Modules.Core import Core1, Core2表示Modules是我的顶级,但ProjectX甚至不包括__init__.py到文件夹结构。

这是我的问题:

  

有没有办法在main.py中定义顶级文件夹而不移动主文件?

注1:也可以通过添加完整路径来解决问题:from ProjectX.Modules.Core import Core1from ProjectX.Widgets import Widget1,但这不是最佳解决方案,因为我必须{{1}我认为有一种聪明的方式。

注1:我还在sys.path.append()的{​​{1}}内添加了__all__

__init__.py

我没有得到任何结果 我确实包含上面的例子here用于下载/学习。

1 个答案:

答案 0 :(得分:1)

您的CoreX.py文件中不需要相对导入。

只需更改Core2.py

-from ...Widgets import Widget1
+from Widgets import Widget1

注意:您可以重构导入以删除所有相对导入。

diff --git a/Modules/Core/Core1.py b/Modules/Core/Core1.py
index a0650fc..c6109e6 100644
--- a/Modules/Core/Core1.py
+++ b/Modules/Core/Core1.py
@@ -1,4 +1,5 @@
-from ..Engine import Engine1
+from Modules.Engine import Engine1
+
 def HouseNumber():
     house = Engine1.BadLuck()
-     return house 
\ No newline at end of file
+    return house 
diff --git a/Modules/Core/Core2.py b/Modules/Core/Core2.py
index 2638734..b131d1f 100644
--- a/Modules/Core/Core2.py
+++ b/Modules/Core/Core2.py
@@ -1,4 +1,6 @@
-from ...Widgets import Widget1
+from Widgets import Widget1
+
 def DoorColor():
        door = Widget1.door()
-       return door
\ No newline at end of file
+       return door