web-dev-qa-db-fra.com

Comment appeler une commande sed dans un script python?

Par le biais du script python, j'essaie de remplacer une chaîne par une chaîne dans un fichier à l'aide de la commande sed. Je le fais par subprocess.call comme dans le script.

Lorsque j'exécute la commande dans le script ou la commande Shell, tout se passe bien, mais dans python, le résultat obtenu est "Aucun fichier d'entrée". Une idée de comment réparer cette erreur?

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

Sortie

No input file
4
Adam

Évitez subprocess et implémentez les fonctionnalités de sed avec Python à la place, par exemple. avec le module 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

Avec subprocess.call , chaque argument de la commande doit être un élément distinct de la liste (et Shellne doit pas être défini sur Truename__):

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

Ou bien, la commande entière devrait contenir une chaîne, avec Shell=True:

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

Les arguments sont traités de la même manière pour subprocess.call et Popenname__, et la documentation pour subprocess.Popen indique:

Sous Unix avec Shell=True, le shell par défaut est /bin/sh. … Si argsest une séquence, le premier élément spécifie la chaîne de commande et tous les éléments supplémentaires seront traités comme des arguments supplémentaires pour le shell lui-même. C'est-à-dire, Popenfait l'équivalent de:

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