Estoy escribiendo un contenedor para automatizar algunos comandos de shell Android ADB a través de Python (2.7.2). Dado que, en algunos casos, necesito ejecutar el comando de forma asincrónica, estoy usando el método subprocess .Popen para emitir comandos de shell.subprocess.Popen y shlex.split formato en windows y linux
se han topado con un problema con el formato del parámetro [command, args]
del método Popen
, donde no requieren comando/args división es diferente entre Windows y 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
He intentado usar shlex .split(), con y sin la marca posix:
# Windows
posix = False
print shlex.split(cmd, posix = posix), posix
# Linux
posix = True
print shlex.split(cmd, posix = posix), posix
Ambos casos devuelven la misma división.
¿Hay un método en el subprocess
o shlex
que maneja los formatos específicos de OS correctamente?
Esta es mi solución actual:
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()
no creo shlex.split()
está haciendo nada aquí, y cmd.split()
logra resultados idénticos.
Hizo un error ortográfico en la pregunta. shlex vs shelx. – jgritty
@jgritty gracias. Corregido –
¿por qué usas 'shell = True'? – jfs