Через скрипт python я пытаюсь заменить строку на строку в файле с помощью команды sed
. Я делаю это через subprocess.call
, как указано в скрипте.
Когда я запускаю команду в сценарии оболочки или команде, она выполняется нормально, но в python я получаю результат, говорящий "Нет входного файла". Есть идеи, как исправить эту ошибку?
#!/usr/bin/python
import subprocess
subprocess.call(["sed -i -e 's/hello/helloworld/g'","www.txt"], shell=True)
Output
No input file
Необходимо избежать subprocess
и реализовать функциональность sed
с Python вместо этого, например, с 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
:
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], ...])