Tùy thuộc vào phiên bản Python bạn đang sử dụng. In Python3.3, các arg được lưu trong proc.args
:
proc = subprocess.Popen(....)
print("the commandline is {}".format(proc.args))
Trong Python2.7, the args
not saved, nó chỉ là truyền lại cho các chức năng khác như _execute_child
. Vì vậy, trong trường hợp đó, cách tốt nhất để có được những dòng lệnh là để lưu nó khi bạn có nó:
proc = subprocess.Popen(shlex.split(cmd))
print "the commandline is %s" % cmd
Lưu ý rằng nếu bạn có danh sách của đối số (chẳng hạn như các loại điều được trả về bởi shlex.split(cmd)
, sau đó bạn có thể khôi phục lại chuỗi dòng lệnh, cmd
sử dụng chức năng không có giấy tờ subprocess.list2cmdline
:
In [14]: import subprocess
In [15]: import shlex
In [16]: cmd = 'foo -a -b --bar baz'
In [17]: shlex.split(cmd)
Out[17]: ['foo', '-a', '-b', '--bar', 'baz']
In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz'])
Out[19]: 'foo -a -b --bar baz'
Tôi đang ở phiên bản 2.6. Và trong ít nhất là 2.6 list2cmdline không có giấy tờ, vì nó không hoạt động: đối với '--arg = foo bar' những gì python ACTUALLY làm là '--arg = "foo bar"' nhưng list2cmdline cho là '' --arg = foo bar "'... nhưng cảm ơn. –
Tôi nghĩ rằng vấn đề không có với 'list2cmdline', mà là' shlex.split'. 'shlex.split ('- arg =" foo bar "')' trả về một danh sách với một mục duy nhất: '['--arg = foo bar']', trong khi 'shlex.split ('- arg =" foo bar "')' phân tách chính xác các đối số: '[' --arg ',' = ',' foo bar ']'. Trong danh sách sau này 'list2cmdline' hoạt động tốt. – unutbu
Nhân tiện, mô đun 'subprocess' của Python2.6 sử dụng' list2cmdline' để chuyển 'args' thành một danh sách bất cứ khi nào' args' không phải là một chuỗi để nó hoạt động theo nghĩa mà bạn đang thấy là giá trị trả về ' list2cmdline (args) 'là chính xác những gì đang được chuyển sang' execvp * 'hoặc tương đương với Windows. – unutbu