我正在尝试使用Python的子进程以非交互方式在gdb中执行几个命令。
我在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 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格式。
答案 0 :(得分: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']