sous-processus.Popen et shlex.split formatage sous windows et linux
Je suis en train d'écrire un wrapper pour automatiser certaines android ADB shell de commandes via Python (2.7.2).
Depuis, dans certains cas, j'ai besoin d'exécuter la commande en mode asynchrone, je suis en utilisant le sous-processus.Popen méthode pour émettre des commandes du shell.
J'ai couru dans un problème avec la mise en forme de la [command, args]
paramètre de la Popen
méthode, où il y a besoin de commande/args split est la différence entre Windows et Linux:
# sample command with parameters
cmd = 'adb -s <serialnumber> shell ls /system'
# Windows:
s = subprocess.Popen(cmd.split(), shell=False) # command is split into args by spaces
# Linux:
s = subprocess.Popen([cmd], shell=False) # command is a list of length 1 containing whole command as single string
J'ai essayé d'utiliser shlex.split(), et avec la posix drapeau:
# Windows
posix = False
print shlex.split(cmd, posix = posix), posix
# Linux
posix = True
print shlex.split(cmd, posix = posix), posix
Les deux cas, le retour sur la même répartition.
Est-il une méthode en subprocess
ou shlex
qui gère l'OS formats correctement?
C'est ma solution actuelle:
import os
import tempfile
import subprocess
import shlex
# determine OS type
posix = False
if os.name == 'posix':
posix = True
cmd = 'adb -s <serialnumber> shell ls /system'
if posix: # posix case, single command string including arguments
args = [cmd]
else: # windows case, split arguments by spaces
args = shlex.split(cmd)
# capture output to a temp file
o = tempfile.TemporaryFile()
s = subprocess.Popen(args, shell=False, stdout=o, stderr=o)
s.communicate()
o.seek(0)
o.read()
o.close()
Je ne pense pas que shlex.split()
est en train de faire quoi que ce soit ici, et cmd.split()
obtient des résultats identiques.
merci. Corrigés.
pourquoi utilisez-vous
shell=True
?une version précédente de la (pleine) code a échoué avec. J'ai changé il
shell=False
maintenant. Merci pour la remarque.sans rapport:
s.communicate()
est un appel bloquant, il attend la fin du processus (il n'est pas asynchrone), de sorte que vous pourriez utiliser output = subprocess.check_output(args, stderr=STDOUT)
au lieu de output = o.read()
.OriginalL'auteur Nisan.H | 2012-02-17
Vous devez vous connecter pour publier un commentaire.
Ils semblent fonctionner de manière identique lorsque je désactive
shell=True
Que par les docs:
http://docs.python.org/library/subprocess.html
shell=False
args = cmd.split()
etsubprocess.Popen(args, shell=False)
se comportent de façon identique sur les deux linux et windows.OriginalL'auteur jgritty
La
shell=True
argument indique la ligne de commande évaluées par votre shell, qui sur Windows seraCmd.exe
; sur Linux, il sera probablement/bin/bash
, mais pourrait également être certains autres shell (zsh, tcsh, etc.). La différence de comportement est susceptible d'être causés par les obus d'interpréter les commandes différemment.Je recommanderais fortement pas à l'aide de
shell=True
si vous pouvez l'éviter. Juste quelque chose comme ceci:OriginalL'auteur Adam Rosenfield