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

2

Через скрипт 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
    
задан Adam 18.03.2016 в 13:06
источник

2 ответа

3

Вам следует избегать 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"),
    
ответ дан Byte Commander 18.03.2016 в 13:31
источник
7

С 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], ...])
    
ответ дан muru 18.03.2016 в 13:17