Cocoa app无法启动循环python脚本。通过xcode构建/运行时工作

时间:2017-04-07 16:42:52

标签: python objective-c xcode cocoa nstask

我尝试使用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)

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

1 个答案:

答案 0 :(得分:1)

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

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

然后根据需要传递路径。