我怎样才能从带有 GUI 的 Python 应用程序中获得没有依赖关系的 Windows 二进制文件?

How can I get a Windows binary without dependencies from a Python application with a GUI?

我是一名 Python 开发人员,使用 Linux (Ubuntu) 系统进行开发。我想为 Windows 用户编写 GUI 应用程序。这些用户不是开发人员,所以我希望安装/执行尽可能简单。

目前,在我看来,我需要用户安装 GTK / Qt,然后使用 pip 安装我的应用程序。这似乎太复杂了。

有没有办法获得 Windows 没有依赖关系的二进制文件,它可以简单地启动 GTK3 应用程序? (目前,我的代码相对简单,如果您有兴趣,请参阅http://pastebin.com/rNcFm1m7)。

我试过的

pyinstaller

我尝试使用 pyinstaller。我 运行 在我的 Linux 机器上执行以下命令 this code 保存为 formula_writer.py.

pyinstaller --onefile formula_writer.py; dist/formula_writer

没成功:

Traceback (most recent call last):
  File "<string>", line 8, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/moose/FormulaWriter/build/formula_writer/out00-PYZ.pyz/gi", line 42, in <module>
ImportError: cannot import name _gi

由于 GTK3 可能是问题所在,我使用 GTK2 编写了一个非常简单的 Python GUI 应用程序:

#!/usr/bin/env python
# example base.py
import pygtk
pygtk.require('2.0')
import gtk


class Base:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("destroy", self.destroy)
        self.window.show()

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def main(self):
        gtk.main()
print(__name__)

if __name__ == "__main__":
    base = Base()
    base.main()

还是不行:

Traceback (most recent call last):
  File "<string>", line 5, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/moose/FormulaWriter/build/formula_writer_gtk2/out00-PYZ.pyz/gtk", line 30, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/moose/FormulaWriter/build/formula_writer_gtk2/out00-PYZ.pyz/gobject", line 26, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/moose/FormulaWriter/build/formula_writer_gtk2/out00-PYZ.pyz/glib", line 22, in <module>
ImportError: No module named _glib

你必须有一台 Windows 电脑。没有办法。

但是,在 Windows 机器上有多个简单的选项:

如果你有Python包,你也可以去

  • python setup.py bdist --formats=wininst:有效,创建安装程序
  • python setup.py bdist --formats=msi:有效,还创建了一个安装程序