通过 python 脚本,我尝试使用命令将文件中的字符串替换为字符串sed
。我按照subprocess.call
脚本中的方式执行此操作。
当我在 shell 脚本或命令中运行该命令时,它运行良好,但在 python 中我得到的结果是“无输入文件”。有什么想法可以修复该错误吗?
#!/usr/bin/python
import subprocess
subprocess.call(["sed -i -e 's/hello/helloworld/g'","www.txt"], shell=True)
输出
No input file
答案1
和subprocess.call
,命令的每个参数都应是列表中的单独项目(并且shell
不应设置为True
):
subprocess.call(["sed", "-i", "-e", 's/hello/helloworld/g', "www.txt"])
或者,整个命令应该是一个字符串,其中包含shell=True
:
subprocess.call(["sed -i -e 's/hello/helloworld/g' www.txt"], shell=True)
subprocess.call
对于和,参数的处理方式类似Popen
,与subprocess.Popen
说:
在具有 的 Unix 上
shell=True
,shell 默认为/bin/sh
。... 如果args
是一个序列,则第一项指定命令字符串,任何其他项将被视为 shell 本身的附加参数。也就是说,Popen
是否相当于:Popen(['/bin/sh', '-c', args[0], args[1], ...])
答案2
您应该避免使用 Pythonsubprocess
来实现其功能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"),