it-swarm-es.com

¿Cómo llamo a un comando sed en una secuencia de comandos python?

A través de la secuencia de comandos python, estoy tratando de reemplazar una cadena por una cadena en un archivo usando el comando sed. Lo hago a través de subprocess.call tal como aparece en el guión.

Cuando ejecuto el comando en el script o comando de Shell, funciona bien, pero en python obtengo un resultado que dice "Sin archivo de entrada". ¿Alguna idea de cómo solucionar ese error?

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

Salida

No input file
4
Adam

Debe evitar subprocess e implementar la funcionalidad de sed con Python en su lugar, p. con el 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"),
5
Byte Commander

Con subprocess.call , cada argumento del comando debe ser un elemento separado en la lista (y Shell no debe establecerse en True):

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

O bien, todo el comando debe ser una cadena, con _Shell=True_:

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

Los argumentos se tratan de manera similar para _subprocess.call_ y Popen, y como dice la documentación para subprocess.Popen :

En Unix con _Shell=True_, el Shell por defecto es _/bin/sh_. ... Si args es una secuencia, el primer elemento especifica la cadena de comando, y cualquier elemento adicional se tratará como argumentos adicionales para el Shell. Es decir, Popen hace el equivalente de:

_Popen(['/bin/sh', '-c', args[0], args[1], ...])
_
11
muru