包创建和__init__.py内容

时间:2014-01-07 15:01:20

标签: python python-import

这个问题似乎很明显,但我找不到任何令人满意的答案......

所以,我在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
    

那么,我怎么能这样做?我是否应该梦想到这一点?

2 个答案:

答案 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 等。