Como eu chamo um comando sed em um script python? [fechadas]

2

Por meio do script python, estou tentando substituir uma string por uma string em um arquivo usando o comando sed . Eu faço isso através de subprocess.call como no script.

Quando eu executo o comando no shell script ou comando, ele roda bem, mas em python eu recebo um resultado dizendo "Nenhum arquivo de entrada". Alguma idéia de como corrigir esse erro?

#!/usr/bin/python
import subprocess
subprocess.call(["sed -i -e 's/hello/helloworld/g'","www.txt"], shell=True)

Saída

No input file
    
por Adam 18.03.2016 / 13:06

2 respostas

2

Você deve evitar subprocess e implementar a funcionalidade de sed com o Python, por exemplo, com o módulo 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"),
    
por Byte Commander 18.03.2016 / 13:31
8

Com subprocess.call , todos os argumentos do comando devem ser separados item na lista (e shell não deve ser definido como True ):

subprocess.call(["sed", "-i", "-e",  's/hello/helloworld/g', "www.txt"])

Ou, o comando inteiro deve ter uma string, com shell=True :

subprocess.call(["sed -i -e 's/hello/helloworld/g' www.txt"], shell=True)

Os argumentos são tratados de forma semelhante para subprocess.call e Popen e como a documentação para subprocess.Popen diz:

  

No Unix com shell=True , o padrão do shell é /bin/sh . …   Se args for uma sequência, o primeiro item especifica a string de comando,   e quaisquer itens adicionais serão tratados como argumentos adicionais para   a própria casca. Isto é, Popen faz o equivalente a:

Popen(['/bin/sh', '-c', args[0], args[1], ...])
    
por muru 18.03.2016 / 13:17