2016-11-04 11 views
1

gdbで非対話的にいくつかのコマンドを実行するためにPythonのサブプロセスを使用しようとしています。複数の引用符で囲まれた引数を持つPopenを使用しています

私はシェルで実行したい同等のコマンドは次のようになります。私は次の出力をしたい

gdb - 9833 -ex "set someval=50" -ex "p someval" --batch 

を:

[Thread debugging using libthread_db enabled] 
[New Thread 0x2b6c64f09dc0 (LWP 9833)] 
[New Thread 0x549ec940 (LWP 12128)] 
[New Thread 0x585f2940 (LWP 12127)] 
: ... 
0x0000003670407655 in pthread_join() from /lib64/libpthread.so.0 
$1 = 50 

私は同じ出力を得るためにPythonでスクリプトにそれを試してみてください、gdb引数は実行されません。 cmdlineのargsを使用してコマンド文字列を入力しています。

出力を印刷するときにgdbがpidに付いていますが、gdbの出力が表示されず、実行されたセットも表示されません。

ここに私のスクリプトです:

cmd = ['gdb','-',pid,'-ex','"set ' + sys.argv[2] + '=' + sys.argv[3] + '"','-ex','"p ' + sys.argv[2] + '"','--batch'] 
print cmd 
result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate() 
print result 

は、@larsks、ありがとうございました。あなたの応答は、cmd形式の私の混乱した理解を本当にクリアしました。残念ながら、私は自分の環境でPython 2.4に悩まされていますので、より洗練されたstr形式は使用できません。

答えて

4

引用が多すぎます。あなたはこのようになりますシェルコマンドを使用している場合:

echo "this is a test" 

subprocess.Popenと同等の呼び出しは次のとおりです。

二つの要素のコマンドがあります
subprocess.Popen(['echo', 'this is a test']) 

、ちょうどシェルコマンド秒のように引数には空白が含まれます。

を念頭に置いて

、この:

:私はこれが同じ場所になってもう少し明確な方法だと思いますが

cmd = ['gdb','-',pid, 
     '-ex','set ' + sys.argv[2] + '=' + sys.argv[3], 
     '-ex','p ' + sys.argv[2], 
     '--batch'] 

gdb - 9833 -ex "set someval=50" -ex "p someval" --batch 

はこのようなものになり

cmd = ['gdb','-',pid, 
     '-ex', 'set {}={}'.format(sys.argv[2], sys.argv[3]), 
     '-ex', 'p {}'.format(sys.argv[2]), 
     '--batch'] 
関連する問題