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 构建/运行时工作的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式创建 Cocoa 应用程序主菜单应用程序 [关闭]