2013-02-12 41 views
25

我正在使用subprocess.Popen調用,在另一個問題中,我發現我誤解了Python爲命令行生成參數的方式。輸出由子流程調用的命令行?

我的問題
有沒有辦法找出實際的命令行是什麼?

示例代碼: -

proc = subprocess.popen(....) 
print "the commandline is %s" % proc.getCommandLine() 

你怎麼會寫getCommandLine

回答

41

這取決於您使用的Python版本。 In Python3.3時,ARG被保存在proc.args

proc = subprocess.Popen(....) 
print("the commandline is {}".format(proc.args)) 

在Python2.7,the args not saved,它只是傳遞到其他功能,如_execute_child。所以,在這種情況下,要獲得命令行的最好方法是保存它時,你就會明白:

proc = subprocess.Popen(shlex.split(cmd)) 
print "the commandline is %s" % cmd 

需要注意的是,如果你有參數的列表(如類型

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' 
+0

我在2.6。在2.6中,至少list2cmdline是沒有記錄的,因爲它不起作用:'--arg = foo bar'python ACTUALLY所做的是'--arg ='foo bar'',但是list2cmdline給出的是'' --arg = foo bar「'...但是,謝謝。 – 2013-02-12 16:49:56

+0

我認爲問題不在'list2cmdline',而是'shlex.split'。 'shlex.split(' - arg =「foo bar」')'返回一個包含單個項目的列表:'['--arg = foo bar']',while'shlex.split(' - arg =「 foo bar「')'正確地分割參數:'['--arg','=','foo bar']'。在後面的列表中'list2cmdline'工作正常。 – unutbu 2013-02-12 16:58:26

+0

順便說一句,只要'args'不是一個字符串,Python2.6的'subprocess'模塊就會使用'list2cmdline'將'args'轉換爲列表,因此它的工作原理就是您所看到的作爲' list2cmdline(args)'正是傳遞給'execvp *'或Windows等價物的東西。 – unutbu 2013-02-12 17:04:04

2

正確回答我的問題其實是,有:由shlex.split(cmd)返回的東西,那麼你可以使用未公開的函數subprocess.list2cmdline恢復命令行字符串,cmd IS沒有命令行。子進程的重點在於它通過IPC完成所有工作。 list2cmdline儘可能地接近預期,但實際上最好的辦法是查看「args」列表,並且只知道這將是被調用程序中的argv。

+2

['list2cmdline()'](https:// hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541)僅在Windows上適用於與MS C運行時分析命令行方式兼容的應用程序。它將參數列表轉換爲傳遞給'CreateProcess()'的字符串。 ['cmd.exe'使用不同的規則](http://stackoverflow.com/q/27864103/4279)。在POSIX上,列表直接傳遞給'os.execve()'(+/- os.fsencode())。 – jfs 2015-02-05 16:55:45