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.

Vous avez fait une faute de frappe dans la question. shlex vs shelx.
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