如果从finder执行app bundle但是从命令行运行良好,则使用python构建的OSX应用程序会立即退出

use*_*047 5 macos pyqt pyinstaller pyqt4 py2app

所以我有这个pyqt项目,我想使用pyinstaller构建一个osx.app dmg

pyinstaller创建了输出

dist/MyApplication.app
Run Code Online (Sandbox Code Playgroud)

我可以直接从终端运行它

cd dist
./MyApplication.app/Contents/MacOS/MyApplication
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试直接运行应用程序包,请使用

open -a MyApplication.app
Run Code Online (Sandbox Code Playgroud)

要么

open .
# double click on MyApplication.app folder (appears just as MyApplication from finder)
Run Code Online (Sandbox Code Playgroud)

它启动然后立即退出

现在,如果我导航到

$ cd ./Contents/MacOS/
Run Code Online (Sandbox Code Playgroud)

并打开一个发现者

$ open .
#then double click on MyApplication
Run Code Online (Sandbox Code Playgroud)

它运行正常,但在后台打开终端窗口

Last login: Fri Mar 14 18:01:13 on ttys005
MyApplication/dist/MyApplication.app/Contents/MacOS/MyApplication ; exit;
MyApplication/dist/MyApplication.app/Contents/MacOS/MyApplication ; exit;
Run Code Online (Sandbox Code Playgroud)

我使用类似的步骤来构建一个没有任何问题的Windows exe(虽然在Windows中没有MyApplication.app概念)

我该如何诊断这个问题?

谢谢

use*_*047 2

所以我按照这个py2app 教程来看看它是否比 pyinstaller 更好用,使用这段代码

\n\n
if __name__=="__main__":\n    print "Hello"\n
Run Code Online (Sandbox Code Playgroud)\n\n

并得到了类似的结果

\n\n

当我这样做时,即应用程序关闭

\n\n
open -a HelloTest.app\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然它运行良好

\n\n
./HelloTest.app/Contents/MacOS/HelloTest\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是教程中的这个花絮解释了它

\n\n
When run normally, your application\xe2\x80\x99s stdout \nand stderr output will go to the Console logs. \nTo see them, open the Console application:\n\n$ open -a Console\n
Run Code Online (Sandbox Code Playgroud)\n\n

检查控制台日志后,似乎如果我运行

\n\n
open -a MyApplication.app\n
Run Code Online (Sandbox Code Playgroud)\n\n

该应用程序在沙箱中运行,如果您打开任何要写入的文件而不指定绝对\n路径,它将无法创建该文件

\n\n

如果我跑

\n\n
./MyApplication.app/Contents/MacOS/MyApplication\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用程序可以直接在当前目录中创建文件

\n\n

因此,我必须返回并在创建文件时指定完整路径,而不是仅仅假设它将在工作目录中创建。

\n