Cocoa 应用程序无法开始循环 python 脚本。通过 xcode 构建/运行时工作

Posted

技术标签:

【中文标题】Cocoa 应用程序无法开始循环 python 脚本。通过 xcode 构建/运行时工作【英文标题】:Cocoa app cannot start looping python script. Works when built/run through xcode 【发布时间】:2017-04-07 16:42:52 【问题描述】:

我正在尝试使用 NSTask 从可可应用程序启动循环 python 脚本。 Python 脚本最终位于应用程序的 Contents/Resources 文件夹中。

我得到脚本的路径并使用以下命令创建 NSTask:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:filename ofType:@"py"];
    NSTask* task = [[NSTask alloc] init];
    task.launchPath = PYTHON_PATH;
    task.arguments = [NSArray arrayWithObjects:scriptPath, nil];
    [task launch];
    [task waitUntilExit];
);

(为了便于阅读,我省略了 stdOutPipe 的内容)

当我从 xcode 构建和运行我的应用程序时,它按预期工作,任务保持在 waitUntilExit 并且 python 脚本连续运行。

当我尝试从生成的 .app 文件运行它时,它会到达 waitUntilExit,停顿一段时间,然后退出并出现错误。我已经登录了 python 脚本,所以我知道在这段时间内没有运行脚本的任何部分。脚本路径与 python 脚本的位置一致,并且在从 xcode 或从 .app 运行时返回相同的路径。

我认为我的某些项目设置设置不正确,但它似乎正确处理资源。任何的想法?

更新 1 仅使用 print 语句运行非循环 python 脚本适用于 .app。以下非循环脚本也会失败:

#!/usr/bin/python      
import os

def log(string):
    print(string)
    path = os.environ['PWD'] + '/smoke_screen_test.txt'
    f1=open(path, 'a')
    f1.write(string + "\n")

if __name__ == '__main__':
    log("Test works")
    exit(0)

也许导入语句搞砸了?还是文件创建?

【问题讨论】:

一个简单的非循环python脚本可以从同一路径运行吗? @pkamb 好问题!对于非循环 python 函数,.app 将无错误地执行。这能告诉你什么吗? @pkamb 实际上我很快就谈到了,一个只有打印语句的测试非循环脚本将在 .app 中执行,但上面更新中的脚本也会失败。 我主要是想您在从您的应用程序运行 any 脚本时可能会遇到沙盒违规等问题。 NSApplicationScriptsDirectory 需要吗? 【参考方案1】:

问题在于os.environ['PWD'] 的使用。 PWD 不返回正在执行的脚本的本地目录。呃。解决方案是从 argv[0] 中获取脚本的路径并使用该路径的目录:

path = os.path.dirname(sys.argv[0])

然后根据需要传递路径。

【讨论】:

以上是关于Cocoa 应用程序无法开始循环 python 脚本。通过 xcode 构建/运行时工作的主要内容,如果未能解决你的问题,请参考以下文章

在 CLI Cocoa 应用程序中,如何实现事件循环?

如何以编程方式创建 Cocoa 应用程序主菜单应用程序 [关闭]

为啥我的 Cocoa 应用程序中的某些行需要永远运行?

谷歌应用脚​​本没有循环

Cocoa:将 NSApplication 集成到现有的 c++ 主循环中

Cocoa Touch 框架无法识别