J'essaie donc de passer de os.popen à subprocess.popen comme recommandé par le guide de l'utilisateur. Le seul problème que j'ai, c'est que je n'arrive pas à trouver un moyen de faire fonctionner readlines ().
Alors je pouvais faire
list = os.popen('ls -l').readlines()
Mais je ne peux pas faire
list = subprocess.Popen(['ls','-l']).readlines()
Avec subprocess.Popen
, Utilisez communicate
pour lire et écrire des données:
out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate()
Ensuite, vous pouvez toujours séparer la chaîne des processus 'stdout
avec splitlines()
.
out = out.splitlines()
ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()
ou, si vous voulez lire ligne par ligne (peut-être que l'autre processus est plus intensif que ls
):
for ln in ls.stdout:
# whatever
Faire un appel système qui renvoie la sortie stdout sous forme de chaîne :
lines = subprocess.check_output(['ls', '-l']).splitlines()
Une manière plus détaillée d'utiliser le sous-processus.
# Set the command
command = "ls -l"
# Setup the module object
proc = subprocess.Popen(command,
Shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# Communicate the command
stdout_value,stderr_value = proc.communicate()
# Once you have a valid response, split the return output
if stdout_value:
stdout_value = stdout_value.split()
list = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0].splitlines()
directement depuis la help(subprocess)