web-dev-qa-db-ja.com

pythonスクリプトでsedコマンドを呼び出すにはどうすればよいですか?

pythonスクリプトを通じて、sedコマンドを使用して、ファイル内の文字列で文字列を置き換えようとしています。これは、スクリプトのsubprocess.callを介して行います。

シェルスクリプトまたはコマンドでコマンドを実行すると正常に実行されますが、pythonで「入力ファイルなし」という結果が表示されます。そのエラーを修正する方法はありますか?

#!/usr/bin/python
import subprocess
subprocess.call(["sed -i -e 's/hello/helloworld/g'","www.txt"], Shell=True)

出力

No input file
4
Adam

subprocessを避け、代わりにPythonでsedの機能を実装する必要があります。 fileinputモジュールの場合:

#! /usr/bin/python
import fileinput
for line in fileinput.input("www.txt", inplace=True):
    # inside this loop the STDOUT will be redirected to the file
    # the comma after each print statement is needed to avoid double line breaks
    print line.replace("hello", "helloworld"),
5
Byte Commander

subprocess.call を使用すると、コマンドのすべての引数はリスト内の個別の項目である必要があります(およびShellTrueに設定しないでください):

subprocess.call(["sed", "-i", "-e",  's/hello/helloworld/g', "www.txt"])

または、Shell=Trueを使用して、コマンド全体に1つの文字列を含める必要があります。

subprocess.call(["sed -i -e 's/hello/helloworld/g' www.txt"], Shell=True)

引数はsubprocess.callPopenについても同様に扱われ、 subprocess.Popen のドキュメントには次のように記述されています。

UnixでShell=Trueを使用する場合、シェルはデフォルトで/bin/shになります。 …argsがシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。つまり、Popenは次と同等のことを行います。

Popen(['/bin/sh', '-c', args[0], args[1], ...])
11
muru