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
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"),
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
_. ... Siargs
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], ...])
_