9

一連の引数としてフォーマットされたPythonサブプロセス呼び出しがあります(subprocess.Popen(['ls','-l'])単一の文字列(つまり)ではなくsubprocess.Popen('ls -l'))。

私が行ったようにシーケンス引数を使用する場合、(デバッグ目的で) シェルに送信される結果の文字列を取得する方法はありますか?

簡単な方法の 1 つは、すべての引数を自分で結合することです。しかし、シーケンスを使用する主な理由は、「モジュールが必要なエスケープと引数の引用を処理できるようにする」ためであるため、これがすべての場合にサブプロセスと同じになるとは思えません。

4

2 に答える 2

18

コメントで述べたように、引数のリストを単一の文字列に変換するsubprocess(ドキュメント ページには記載されていません) が付属しています。list2cmdlineソース ドキュメントによると、list2cmdline主に Windows で使用されます。

Windows の場合: Popen クラスは CreateProcess() を使用して、文字列を操作する子プログラムを実行します。args がシーケンスの場合、list2cmdline メソッドを使用して文字列に変換されます。すべての MS Windows アプリケーションがコマンド ラインを同じように解釈するわけではないことに注意してください。list2cmdline は、MS C ランタイムと同じ規則を使用するアプリケーション用に設計されています。

それにもかかわらず、それは他の OS でも十分に使用できます。

編集

逆の操作 (つまり、コマンド ラインを適切にトークン化された引数のリストに分割する) が必要な場合は、 のドキュメントにshlex.split示されているように、関数を使用する必要があります。subprocess

>>> help(subprocess.list2cmdline)
Help on function list2cmdline in module subprocess:

list2cmdline(seq)
    Translate a sequence of arguments into a command line
    string, using the same rules as the MS C runtime:

    1) Arguments are delimited by white space, which is either a
       space or a tab.

    2) A string surrounded by double quotation marks is
       interpreted as a single argument, regardless of white space
       contained within.  A quoted string can be embedded in an
       argument.

    3) A double quotation mark preceded by a backslash is
       interpreted as a literal double quotation mark.

    4) Backslashes are interpreted literally, unless they
       immediately precede a double quotation mark.

    5) If backslashes immediately precede a double quotation mark,
       every pair of backslashes is interpreted as a literal
       backslash.  If the number of backslashes is odd, the last
       backslash escapes the next double quotation mark as
       described in rule 3.
于 2012-08-26T12:49:37.120 に答える