【问题标题】:After turning into OSX app, Python subprocess can't call external console command转成OSX app后,Python子进程无法调用外部控制台命令
【发布时间】:2014-11-13 02:36:27
【问题描述】:

我正在使用 Kivy 开发一个 GUI 应用程序,然后它将使用 subprocess.Popen 从 Python 脚本调用外部控制台程序并实时捕获其 stderr 输出。最后,它起作用了(感谢 SO!)。我使用 Pyinstaller 打包应用程序,它会生成一个 *.app,其中包含驻留在 Contents\MacOS 中的可执行文件。如果我直接从终端中运行这个可执行文件,它运行良好。 stderr 输出可以实时捕获。但是,如果我尝试使用终端中的 open 命令直接运行 *.app,或者从 Finder 中双击其 *.app 图标,则对 subprocess.Popen 的调用将停止。

对此我不确定,但是对于 OSX 应用程序如何执行外部程序有任何限制吗?

【问题讨论】:

  • 由于您在运行*.app 文件时没有从终端运行,因此Python 进程可能无法获取sys.stdoutsys.stderr 的打开文件句柄。
  • subprocess.Popen 会运行什么命令?您是否指定其完整路径?尝试完整路径,因为通过 GUI 执行的应用程序的 PATH 与命令行不同(我觉得这很烦人,但确实如此。)如果这不是问题,Popen 报告什么错误?跨度>
  • 事实证明,在彻底跟踪代码之后,停止应用程序的并不是子进程调用。我在此问答页面的答案部分进行了解释。感谢大家的帮助!

标签: python macos subprocess


【解决方案1】:

应用程序停止的原因原来不是subprocess.Popen调用,而是mktemp调用在*.app folder内部创建了一个临时文件,默认情况下绝对不允许Mac应用程序写入.注释掉后,代码运行得很好。我会记下这一点并提醒自己不要再在*.app文件夹中创建临时文件!

【讨论】:

  • 您可以接受您自己的答案以表明问题已解决。
  • 当然,但是两天后才允许我:)
猜你喜欢
  • 2012-04-06
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2021-04-11
  • 2016-01-29
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多