Как вызвать команду sed в скрипте python? [закрыто]

Через скрипт 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
4
задан 18 March 2016 в 06:23

2 ответа

Необходимо избежать 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"),
5
ответ дан 23 November 2019 в 11:35

С 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], ...])
12
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: