【问题标题】:python or pythonw in creating a cross-platform standalone GUI apppython 或 pythonw 创建跨平台的独立 GUI 应用程序
【发布时间】:2014-05-14 15:40:30
【问题描述】:

我正在用 python 开发一个简单的独立图形应用程序。我的开发是在 linux 上完成的,但我想跨平台分发应用程序。

我有一个启动器脚本,它检查一堆环境变量,然后设置各种配置选项,然后调用应用程序,其大小为 python main.py(特别是 os.system('python main.py %s'% (arg1, arg2...))

在 OS X(没有 X11)上,启动器脚本崩溃并出现类似 Could not run application, need access to screen 的错误。稍后进行非常快速的谷歌搜索,该脚本通过将 python main.py 替换为 pythonw main.py 在本地工作。

我的问题是,编写启动器脚本的最佳方法是什么,以便它可以跨平台执行正确的操作而不会崩溃?请注意,这个问题不是问如何确定我在哪个平台上。解决方案“检查我是否在 OS X 上,如果是,则调用 pythonw”是我现在所做的,但这似乎是一个有点 hacky 的修复,因为它取决于了解窗口系统的细节(这可能将来某个时候很容易坏),我想知道是否有更清洁的方法。

这个问题还没有满意的答案。

【问题讨论】:

  • 你是否反对使用 PyInstaller 之类的东西?我发现它通常使跨平台分发变得更加容易,因为它捆绑了您所有的库需求和特定的 python 版本。
  • 不,我并不反对使用工具让我的生活更轻松——我只是对跨平台分发一无所知。不幸的是,似乎没有人让 pyinstaller 使用科学的 python 发行版(我正在使用 canopy)。感谢您的建议。

标签: python user-interface cross-platform


【解决方案1】:

如果您将文件保存为main.pyw,它应该运行脚本而无需打开新的 cmd/终端。

然后你可以以python main.pyw运行它

【讨论】:

  • @aestrivex 如果你从终端运行它,它不会关闭你执行它的终端,但如果你让它可执行它应该可以工作(虽然我承认,我不太熟悉在 Mac 上使用 .pyw)。 python 的编译器肯定有点缺乏,并且经常需要一些黑客才能使其正常工作。如果您不关心单个文件可执行文件,Cx_Freeze 是另一个不错的选择。我没用过canopy,所以不能说cx_freeze会起作用,但绝对值得一试。
  • 我打开终端并输入python main.pyw。它在此 OS X 机器上返回有关“程序需要使用 pythonw 访问屏幕运行它”的相同错误。我也使脚本可执行,它没有任何区别(我不明白为什么应该这样做)。
  • 花了大约最后一个小时弄乱 pyinstaller 和 py2exe,我同意它们有点缺乏。这个想法很好,但在这种情况下,要正确打包整个程序需要做很多工作。对于我的具体程序,无论如何要求用户安装科学的python发行版也不是没有道理,我真的只是在寻找一种方法来编写一个可以跨平台运行程序的启动器。
  • @aestrivex 当你用 pyinstaller 编译时,你会遇到什么错误?您使用的是什么 GUI 框架?您可以提供的细节越多,或者即使您可以提供可重复的步骤,也越好。
  • 我的程序是用 traitsui 编写的,它使用 __import__ 在运行时确定正确的 GUI 后端。我试图创建一个非常愚蠢的 traitsui 程序,使用 wx 后端显示一个带有一个整数字段的 GUI,并为 pyface 提供挂钩。不幸的是,pyinstaller 为支持 GUI 后端所做的努力并不能很好地转化为使用自己的图像资源的 pyface。因此,在获得一些正确导入的钩子后,编译的二进制文件失败并出现NotImplementedError: ImageResource not found 之类的错误,我意识到修复它的范围对于我当前的项目来说太大了。
【解决方案2】:

首先,您应该始终将.pyw 用于 GUI。

其次,如果您希望没有 python 的人能够使用您的程序,您可以将其转换为 .exe。过程很简单。最难的部分是下载其中一个:

  • 对于 python 2.x:p2exe
  • 对于 python 3.x:cx_Freeze

如果你决定走这条路,你可以简单地在谷歌上搜索如何使用它们的说明。

另外,如果您在 GUI 中使用 messageboxes,它将无法正常工作。您将不得不创建窗口/顶层。

【讨论】:

  • 如其他答案评论线程中所述,使用.pyw 在 OS X 上不起作用。这个问题仍然没有可接受的答案。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 2015-09-17
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多