这个问题似乎很明显,但我找不到任何令人满意的答案......
所以,我在notes
已知的位置有一个名为PYTHONPATH
的包,我希望根据包调用主模块:
my_python_scripts/
+-- notes/
+-- __init__.py
+-- notes.py <-- this is the main module, containing a main() function
+-- main_window.py
+-- main_window.ui
背后的目的是以这种方式使用它:
import notes
notes.main()
但在这种情况下,我只会收到以下错误:
Traceback (most recent call last):
File "C:\Users\xxxx\notes_launcher.py", line 13, in <module>
notes.main()
AttributeError: 'module' object has no attribute 'main'
目前,我知道如何让它以不同的方式运作:
要么通过调用完整的层次结构,这有点烦人,对我来说似乎是一个奇怪的赌注(如众所周知的from datetime import datetime
):
from notes import notes
notes.main()
或通过调整__init__.py
的内容(但似乎每个人都同意将此文件留空):
from notes import main
那么,我怎么能这样做?我是否应该梦想到这一点?
答案 0 :(得分:4)
您甚至可以在__init__.py中执行from notes.notes import *
,或者只是将notes.py的内容放入__init__.py并且不使用notes.py。人们做到了这两点,据我所知,并没有真正迫切的理由。
答案 1 :(得分:2)
对我来说,正确的方法是在__init__.py
文件中添加必要的内容。我觉得没什么不好的。就是这样 - 用你的包做你想要的初始化。因此,如果您设计的包使用方式与import notes
完全相同,__init__.py
文件在我看来就是正确的位置。
像OpenERP这样的系统大量使用这种技术。 OpenERP中的模块是Python包,它们在__init__.py
文件中导入所有子模块,如 report , wizard 等。