2016-11-04 77 views
1

我想用Python的子進程在gdb中非交互式地執行幾個命令。使用子進程Popen與多個引用的參數

等效命令我在shell執行將是:

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參數填充命令字符串。

我看到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

你有太多的報價。如果你有一個shell命令,看起來像這樣:

echo "this is a test" 

到subprocess.Popen等效呼叫:

subprocess.Popen(['echo', 'this is a test']) 

這兩種元素的命令,就像在shell命令第二參數包含空白。

考慮到這一點,這一點:

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

變爲這樣的事情:

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

雖然我認爲這是獲得同一個地方的一個稍微清晰的方式:

cmd = ['gdb','-',pid, 
     '-ex', 'set {}={}'.format(sys.argv[2], sys.argv[3]), 
     '-ex', 'p {}'.format(sys.argv[2]), 
     '--batch']