0

I'm developing a rather complex desktop application using wxPython framework. At this point, app already contains a dozens of modules: libraries, UI modules, util modules.

Project looks like this:

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

Unfortunately with current project structure I cannot use absolute imports, because python MyApp/main.py will fail with error like ImportError: No module named MyApp.gui

To overcome this, I'd like to make MyApp an executable package:

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

Now application can be started using python -m my_app

Everything seems ok so far… but I am full of doubts, because no-one uses such approach. If you take a look at demo that comes with wxPython you'll see that it's mostly flat project.

I'm definitely not the smartest one therefore I'm missing something simple and obvious why no-one uses such approach.

Maybe I should just stick with subfolders or flat project structure? Maybe absolute imports don't worth such changes?

4

3 回答 3

2

如果我是你,我会查看一些现有的 wxPython 应用程序,看看它们是如何做到的。

甚至是 wxPython 演示包。

于 2012-12-03T20:03:01.577 回答
2

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

就像是:

#!/usr/bin/python

import sys
from MyApp import main

main.main(sys.argv)

只需将其命名myapp并安装在 /usr/local/bin (或 PATH 上的某个位置)。它所做的只是导入主模块并运行主函数(或类)。

于 2012-12-03T21:46:02.083 回答
1

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

  1. 你可以更好地组织你的项目。如果您有多个模块负责不同的事情,那么您不必担心与其他库发生冲突。所以它将基本上充当一个简单的命名空间。
  2. 您可以通过 easy_install 或其他方式获得更新的好处。我不确定这是否真的是一个很大的优势。
  3. 使用插件可以更容易地扩展,无论是自愿允许它们,还是只是在用户端进行一些调整。

我只会给你一些使用这种方法的例子,我认为主要是插件方法:

  • Exaile:音乐播放器,允许您通过此结构添加插件,同时注意 gui 位于单独的包中。不知道为什么,但它确实使 UI(GTK,但没关系)的分离清晰。
  • 我只是在这里为自己做广告 :) wxpos:这是我的项目之一,如果你想看看我以 wxPython 为例的方法。

比我能想到的还要多,我敢肯定我在其他地方也看到过。

于 2012-12-03T21:50:36.603 回答