61

私はsubprocess.Popen呼び出しを使用していますが、別の質問で、Python がコマンド ラインの引数を生成する方法を誤解していたことがわかりました。

私の質問
実際のコマンド ラインが何であったかを調べる方法はありますか?

コード例:-

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

どのように書きgetCommandLineますか?

4

3 に答える 3

86

使用している Python のバージョンによって異なります。Python3.3では、引数は次の場所に保存されproc.argsます。

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

Python2.7 ではargsは保存されず、 などの他の関数に渡されるだけ_execute_childです。したがって、その場合、コマンドラインを取得する最善の方法は、取得したら保存することです。

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

引数のリスト( によって返されるもののタイプなど)がある場合は、文書化されていない関数 を使用してshlex.split(cmd)、コマンドライン文字列を復元できることに注意してください。cmdsubprocess.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'
于 2013-02-12T16:33:43.060 に答える
6

私の質問に対する正しい答えは、実際にはコマンドラインがないということです。サブプロセスのポイントは、IPC を介してすべてを行うことです。list2cmdline は期待できる限り近い動作をしますが、実際には「args」リストを見て、それが呼び出されたプログラムの argv になることを確認するのが最善の方法です。

于 2013-02-12T20:26:10.573 に答える