将python应用程序开发为包是一种好习惯

时间:2012-12-03 19:52:19

标签: python user-interface wxpython

我正在使用wxPython框架开发一个相当复杂的桌面应用程序。此时,app已经包含了许多模块:库,UI模块,util模块。

项目如下:

MyApp/
    __init__.py -- empty
    main.py
    util/
        __init__.py -- empty
    lib1/
        __init__.py
    lib2/
        __init__.py
    gui/
        __init__.py -- empty
        window1.py

不幸的是,对于当前的项目结构,我无法使用绝对导入,因为python MyApp/main.py将失败并出现ImportError: No module named MyApp.gui

之类的错误

为了解决这个问题,我想将MyApp作为可执行程序包:

my_app/
    __init__.py -- empty
    __main__.py
    util/
        __init__.py -- empty
    lib1/
        __init__.py
    lib2/
        __init__.py
    gui/
        __init__.py -- empty
        window1.py

现在可以使用python -m my_app

启动应用程序

到目前为止一切似乎都很好......但我充满怀疑,因为没有人使用这种方法。如果你看一下wxPython附带的demo,你会发现它主要是平面项目。

我绝对不是最聪明的人因此我错过了一些简单而明显的原因,为什么没有人使用这种方法。

也许我应该坚持使用子文件夹或平面项目结构?也许绝对进口不值得这样改变?

3 个答案:

答案 0 :(得分:2)

如果我是你,我会看一下那里的一些wxPython应用程序,看看他们是如何做到的。

甚至是wxPython演示包。

答案 1 :(得分:2)

将大部分内容放在包命名空间中是最好的方法,因为您还可以利用字节码缓存和setuptools / Distribute可以轻松安装它。然后,您只需提供一个简单的顶级脚本来加载主模块并运行它。

类似的东西:

#!/usr/bin/python

import sys
from MyApp import main

main.main(sys.argv)

只需将myapp命名为/ usr / local / bin(或PATH上的某个位置)即可。它只是导入主模块并运行main函数(或类)。

答案 2 :(得分:1)

你似乎明白为什么把它放在一个包装下是件好事。所以我想我会简单地回顾一下:

  1. 您可以更好地组织您的项目。如果您有多个模块负责不同的事情,您不必担心与其他库发生冲突。所以它基本上就是一个简单的命名空间。
  2. 您可以通过easy_install或其他任何方式获得更新。我不确定它真的是一个很大的优点。
  3. 使用插件进行扩展可能更容易,无论是自愿允许插件,还是只是留在用户端进行一些调整。
  4. 我将给你一些使用这种方法的例子,我认为主要是针对插件的方法:

    • Exaile:音乐播放器,允许您通过此结构添加插件,并注意gui在单独的包中。不知道为什么,但它肯定会使UI(GTK,但无关紧要)的分离清晰。
    • 我会在这里做广告:) wxpos:这是我的一个项目,如果你想以wxPython为例看一下我的方法。

    我能想到的不仅仅是,我相信我已经在其他地方看到了它。