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.
任意の入力がはるかに高く評価されます。私はここで壁に向かって頭を叩いている。
私は同様の問題がありました。xbuildが他のプロセスを作成し、それがゼロ以外のステータスで存在する場合、 'subprocess'はそれをキャッチしてSIGTERMを送信します。私はスクリプトをbashに移植することになりましたが、あなたのケースで受け入れられるかどうかわかりません。 – Marat
文字列を適切な引数リストに変換して 'shell = True'を省略するとどうなりますか? –
@Marat私はそれについて考えましたが、私は私が望むものを達成するのにとても近いので、ここでは頑固になっています:-) –