3

これを行う方法について少し混乱しています。

私がする必要があるのは、Python スクリプト内から、いくつかの引数とファイル名を入力として受け取る外部コマンドを呼び出すことです。

私が「prog」と呼んでいる実行可能ファイル、入力ファイルを「file」と呼びましょう。したがって、コマンド ライン (Bash ターミナル内) は次のようになります。

$ prog --{arg1} {arg2} < {file}

上記の {arg1} は文字列で、{arg2} は整数です。

以下を使用する場合:

#!/usr/bin/python
import subprocess as sbp 
sbp.call(["prog","--{arg1}","{arg2}","<","{file}"])

結果は、「prog」からのエラー出力であり、入力が欠落していると主張しています {arg2}

以下は、興味深いエラーを生成します。

#!/usr/bin/python
import subprocess as sbp 
sbp.call(["prog","--{arg1} {arg2} < {file}"])

2 番目の文字列からすべてのスペースが削除され、最後に等号が追加されたようです。

command not found --{arg1}{arg2}<{file}=

この動作はどれも私には意味がないように思えます。また、オンラインで見つけた Python のマニュアル ページから理解できることはあまりありません。sbp.call を sbp.Popen に置き換えても問題は解決しないことに注意してください。

4

1 に答える 1

4

問題は、< {file}実際にはプログラムの引数ではなく、シェルがリダイレクトを設定するための構文であることです。シェルを使用するように Python に指示するか、リダイレクトを自分でセットアップすることができます。

from subprocess import *

# have shell interpret redirection
check_call('wc -l < /etc/hosts', shell=True)

# set up redirection in Python
with open('/etc/hosts', 'r') as f:
    check_call(['wc', '-l'], stdin=f.fileno())

最初の方法の利点は、入力が速くて簡単なことです。ただし、多くの欠点があります。シェルを起動しているため、潜在的に遅くなります。オペレーティング システム シェルの構文に依存するため、移植性がない可能性があります。また、ファイル名にスペースやその他の特殊文字が含まれていると、簡単に破損する可能性があります。

したがって、2 番目の方法が優先されます。

于 2013-01-23T00:00:21.513 に答える