我尝试使用NSTask从cocoa应用程序启动循环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)
也许导入语句搞砸了?还是文件创建?
答案 0 :(得分:1)
问题在于使用os.environ['PWD']
。 PWD不返回正在执行的脚本的本地目录。咄。解决方案是从argv [0]中获取脚本的路径并使用该路径的目录:
path = os.path.dirname(sys.argv[0])
然后根据需要传递路径。