私の Mac OS アプリには Python.framework (v 2.7) が含まれているため、「リンクされたフレームワーク」に必須として追加しました。また、アプリでは、次のような NSTask を使用して Python スクリプトを起動しています。
//...
pythonEnv = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"Python.framework/Versions/2.7/bin/python"];
task = [[NSTask alloc] init];
outPipe = [NSPipe pipe];
readHandle = [outPipe fileHandleForReading];
data = [[NSMutableData alloc] init];
args = [NSArray arrayWithObjects: scriptPath, kbt, server, port, username, password, nil];
[task setArguments:args];
[task setLaunchPath: pythonEnv];
readHandle = [outPipe fileHandleForReading];
[task setStandardInput:[NSPipe pipe]];
[task setStandardOutput:outPipe];
[task launch];
[task waitUntilExit];
//...
アプリをビルドし、Python スクリプトで使用するバージョンを確認するとsys.path
、次のように返されます。
["/Users/...スクリプトへのパス.../Contents/Resources"、"/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip"、"/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7", "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin", "/Library/Frameworks/Python.framework/Versions/2.7 /lib/python2.7/plat-mac", "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages", "/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/lib-tk", "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old", "/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/lib-dynload", "/Users/tatiana/Library/Python/2.7/lib/python/site-packages", "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages", "/Library/Python/2.7/site-packages"]
...含まれているフレームワークを使用していません。他にどこで正しいパスを設定する必要がありますか? ビルド設定で忘れているものはありますか?
更新 1 ------------------------
タスク環境を設定せず、Python で をテストするとsys.executable
、次のようになります。
/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
...私のフレームワークを使用していないようです。タスク環境を次のように設定した場合:
// pythonEnv = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"Python.framework/Versions/2.7/bin/python"];
NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys: pythonEnv, @"PYTHONPATH", nil];
[task setEnvironment:environment];
それをテストしても、同じ結果が得られます。しかし、Python で でテストするとos.environ["PYTHONPATH"]
、次のようになります。
/Users/tatiana/Desktop/MyApp.app/Contents/Frameworks/Python.framework/Versions/2.7/bin/python
それはもう少し有望に見えますが、なぜ sys.executable が私にそれを与えないのか混乱しています。
更新 2
私のbin/pythonは実行可能ファイルではなかったので、python2.7に変更しました。sys.executable
デフォルトが Library/... であることをまだ示しています
pythonEnv = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"Python.framework/Versions/2.7/bin/python2.7"];
NSString *searchPath = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"Python.framework/Versions/2.7/lib/python2.7"];
NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys: searchPath, @"PYTHONPATH", nil];
[task setEnvironment:environment];