2017-02-21 19 views
2

Xamarinアプリケーション用のPythonビルドスクリプトが用意されています。これは、異なるipaとapkをロケールに基づいてコンパイルする必要があります。サブプロセスと対話するときにPython subprocess.popenが失敗する

スクリプトはinfo.plistとAndroidマニフェストで必要な値を操作し、xbuildを呼び出すためにsubprocess.popenを使用して各バージョンをビルドします。それとも少なくともそれがそうであると思われる方法です。しかし

build_path = os.path.dirname(os.path.realpath(__file__)) 
    ipa_path = "/path/to/my.ipa" 

    cmd = '/Library/Frameworks/Mono.framework/Versions/4.6.2/Commands/xbuild /p:Configuration="Release" /p:Platform="iPhone" /p:IpaPackageDir="%s" /t:Build %s/MyApp/iOS/MyApp.iOS.csproj' % (ipa_path, build_path) 

    subprocess.Popen(cmd, env=os.environ, shell=True) 

の問題は、私がとにかくサブプロセスと対話するとき

これは動作します(基本的に、私は次のバージョンの値を変更する開始する前にそれが行われるまで、私は待つ必要がある)ということですビルドと並行してPythonスクリプトが続行されます。

私はこれを行う場合:

subprocess.Popen(cmd, env=os.environ, shell=True).wait() 

次のエラーメッセージで失敗Xbuild:通常はビルドプロセスには数分かかるのに対し、それが呼び出されているのミリ秒以内に失敗し

Build FAILED. 
    Errors: 

    /Users/sune/dev/MyApp/iOS/MyApp.iOS.csproj: error : 
    /Users/sune/dev/MyApp/iOS/MyApp.iOS.csproj: There is an unclosed literal string. 
    Line 2434, position 56. 

.call、.check_callなどのsubprocess.popenの他の略語メソッド、およびsubprocess.pollおよびsubprocess.communicateの基本操作は、同じe失敗が起こる。

subprocess.Popen(cmd, env=os.environ, shell=True) 

    time.sleep(2) 

私はまた、このような何かを行うことができる必要があり、それを理解して、私は理由を取得しない:

本当に奇妙何

でも呼び出すtime.sleepは同じエラーを引き起こすことができるということです

shell = subprocess.Popen(cmd, env=os.environ, shell=True) 

    while shell.poll() is None: 
     time.sleep(2) 

    print "done" 

、本質的に(shell.waitを呼び出すのと同じことを達成するために)

編集:コマンドリストの代わりに、文字列を使用して

私は

 cmd = [ 
     '/Library/Frameworks/Mono.framework/Versions/4.6.2/Commands/xbuild', 
     '/p:Configuration="Release"', 
     '/p:Platform="iPhone"', 
     '/p:IpaPackageDir="%s' % ipa_path, 
     '/t:Build %s/MyApp/iOS/MyApp.iOS.csproj' % build_path 

    ] 

    subprocess.Popen(cmd, env=os.environ, shell=False) 

このような偽=コマンドリストおよびシェルを使用している場合、これは結果である:

MSBUILD: error MSBUILD0003: Please specify the project or solution file to build, as none was found in the current directory. 

任意の入力がはるかに高く評価されます。私はここで壁に向かって頭を叩いている。

+1

私は同様の問題がありました。xbuildが他のプロセスを作成し、それがゼロ以外のステータスで存在する場合、 'subprocess'はそれをキャッチしてSIGTERMを送信します。私はスクリプトをbashに移植することになりましたが、あなたのケースで受け入れられるかどうかわかりません。 – Marat

+0

文字列を適切な引数リストに変換して 'shell = True'を省略するとどうなりますか? –

+0

@Marat私はそれについて考えましたが、私は私が望むものを達成するのにとても近いので、ここでは頑固になっています:-) –

答えて

1

これは可能ではないと確信しています。これは、サブプロセスモジュールの実装方法の欠点でなければなりません。

xbuildはビルド中に複数のサブプロセスを生成し、ステータスをポーリングすると、pythonのサブプロセスはそれらのいずれかが0以外の戻りステータスを持つことを検出し、ビルドに失敗する1つ以上のxbuildサブプロセス説明したように。

私はbashスクリプトを使ってコンパイルを行い、xmlファイルなどを操作するためにpythonを使いました。

関連する問題