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
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"),
subprocess.call
を使用すると、コマンドのすべての引数はリスト内の個別の項目である必要があります(およびShell
をTrue
に設定しないでください):
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.call
とPopen
についても同様に扱われ、 subprocess.Popen
のドキュメントには次のように記述されています。
Unixで
Shell=True
を使用する場合、シェルはデフォルトで/bin/sh
になります。 …args
がシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。つまり、Popen
は次と同等のことを行います。Popen(['/bin/sh', '-c', args[0], args[1], ...])