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
É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"),
Avec subprocess.call
, chaque argument de la commande doit être un élément distinct de la liste (et Shell
ne doit pas être défini sur True
name__):
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 Popen
name__, et la documentation pour subprocess.Popen
indique:
Sous Unix avec
Shell=True
, le shell par défaut est/bin/sh
. … Siargs
est 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,Popen
fait l'équivalent de:Popen(['/bin/sh', '-c', args[0], args[1], ...])