1

Python スクリプトが次のように呼び出し可能であると仮定します。

python myscript.py ./mycommand > myoutput.txt

シェルが出力をファイルにパイプするのではなく、コマンドライン引数のリストに確実にmyscript.py入るようにするにはどうすればよいですか?./mycommand > myoutput.txtpython myscript.py ./mycommand

編集

引用符を使用すると、追加の問題が発生します。検討:

import subprocess
import sys

argList = sys.argv[1].split()

subprocess.call(argList)

その後、次のように呼び出されます。

python myscript.py 'ls -l > ls.out'

結果は

ls: cannot access >: No such file or directory
ls: cannot access ls.out: No such file or directory

動機は、実行しようとしているコマンドからの出力のみをファイルに保存する必要があることです。myscript.pyからへのその他の出力はstdout、ファイルに送信されません。stdoutにオプションを付けてパイプを設定する必要があるようsubprocess.call()です。引数のリストを直接使用する方法はあります>か?2>2&><

4

2 に答える 2

3

依存関係を引き受ける場合は、Kenneth Reitzenvoyを使用できます(コマンドラインからスクリプトに任意のコマンドを渡す場合は、引用符を使用する必要があります)。

from envoy import run
from sys import argv

run(argv[1])

そして、次を使用して呼び出すことができます。

$ python myscript.py './mycommand > myoutput.txt'

または、Pythonファイルにシェルのような構文が必要な場合は、sh(以前のpbs)またはplumbum:を使用できます。

from sh import ls

with open("myoutput.txt", "w") as outfile:
    ls("-l", _out=outfile)

# Or, in plumbum
from plumbum.cmd import ls

# Yes, this looks crazy, but the docs say it works.
ls["-l"] > "myoutput.txt"
于 2012-10-02T02:09:26.257 に答える
2

標準の bash または tcsh シェルは、指定したコマンド自体を解析し、特定の特殊文字をシェル プロセス自体への指示として解釈します (この例では ">" 文字)。呼び出されたプログラムはこれを制御できません。コマンド ラインの解析は、プログラムが呼び出される前に行われます。

あなたの例では、次のように言えます。

python myscript.py ./mycommand ">" myoutput.txt

引用符で囲まれた ">" は、シェルにその特別な動作を使用しないように指示します。

subprocess モジュールには 2 つの操作モードがあります。シェル (通常は /bin/sh) 中間プロセスを使用するもの - これは、Popenオブジェクトにshell=Trueキーワード引数を与える場合です。この方法で呼び出すと、シェルが呼び出されて引数テキストが解析されます。次に、シェルは、プログラムから一度削除されたサブプロセスとして指定したコマンドを呼び出します。

もう 1 つの動作モード (デフォルト) は whenshell=Falseです。これにより、サブプロセスが作成され、中間シェルがコマンドの文字を解釈しようとすることなく、その ARGV 配列に直接入力されます。

最終的に、特殊文字を解釈するシェルからコマンドを発行し、特殊文字を含めたい場合は、それらをエスケープするか引用符で囲む必要があります。標準ライブラリ モジュールからサブプロセスを呼び出す場合、サブsubprocessプロセスの ARGV の要素として任意のテキストを渡すことができ、中間シェル プロセスによって特別な方法で解釈されることを心配する必要はありません。

于 2012-10-02T01:59:42.113 に答える