【问题标题】:Making a PyInstaller exe do both command-line and windowed使 PyInstaller exe 同时执行命令行和窗口化
【发布时间】:2016-08-16 17:59:53
【问题描述】:

我正在编写一个 Python 程序,它既可以在命令行上使用,也可以作为交互式窗口使用。 (这是个坏主意吗?)如果提供了命令行参数,它会执行一个任务,然后打印“成功”或“失败”。否则,它会启动一个交互式窗口。

PyInstaller 似乎不是为了支持这一点而构建的。我有两个非最佳选择:

  1. 使用 --console 模式:命令行效果很好,但是如果我双击 exe 显示交互式窗口,它也会显示我不想要的控制台窗口
  2. 使用 --noconsole 模式:没有控制台弹出窗口,但使用命令行时没有显示输出。

看来我需要一种方法来不以 --console 模式弹出控制台,或者在 --noconsole 模式下显示打印输出。如果这些选项都不起作用,我可能需要制作一个单独的命令行版本的程序。

有什么建议吗?

【问题讨论】:

标签: python windows command-line pyinstaller


【解决方案1】:

这不是一个完美的解决方案,但这个解决方法为我做了工作:

在 --noconsole --one 文件模式下构建 gui 应用,如下所示:

pyinstaller --noconsole --onefile hello.py

当您从 Windows 双击应用程序时,它将正常启动(没有控制台)。

现在要查看输出,从命令行导航到可执行文件并键入:

hello.exe | more

“| more”应该将打印语句发送到控制台。

【讨论】:

  • | findstr "^" 也可以,并且不会像 more 那样阻塞
【解决方案2】:

这是 Windows(不是 PyInstaller)的问题,需要在编译时将子系统指定为 CONSOLEWINDOWS

推荐的解决方案是将您的应用(例如hello)拆分为两个不同的版本:

  1. hellow.exe 用于 GUI 版本(窗口)和
  2. hello.exe 用于 CLI 版本(控制台)

理论上,您还可以添加一个包装器.exe,在上面的两个实际二进制文件之间切换,具体取决于它的调用方式..

【讨论】:

  • 这个理论是行不通的,因为调用程序是分配控制台的程序,并根据子系统选择阻塞/不阻塞。没有办法欺骗 powershell 等待结果...只需要有 2 个 exe
猜你喜欢
  • 2016-12-26
  • 2013-01-11
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多