2017-04-07 30 views
0

我试图使用NSTask从可可应用程序启动循环Python脚本。 python脚本最终在应用程序的Contents/Resources文件夹中。可可应用程序无法启动循环python脚本。建立/运行时通过xcode

我得到的脚本路径,并与创建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

一个简单的非循环Python脚本可以从相同的路径运行吗? – pkamb

+0

@pkamb好问题! .app将无错地执行一个非循环的python函数。这是否告诉你什么? – Dirk

+0

@pkamb其实我很快就会谈到,只有打印语句的测试非循环脚本将在.app中执行,但上面更新中的脚本也会失败。 – Dirk

回答

1

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

根据需要

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

然后围绕传递路径。