форматирование subprocess.Popen и shlex.split в windows и linux

Я пишу обертку для автоматизации некоторых команд оболочки ADB android через Python (2.7.2). Поскольку в некоторых случаях мне нужно выполнить команду асинхронно, я использую метод subprocess.Popen для выполнения команд оболочки.

Я столкнулся с проблемой форматирования параметра [command, args] метода Popen, где требуемое разделение команды/args отличается между Windows и Linux:

# sample command with parameters
cmd = 'adb -s  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

Я пробовал использовать shlex.split(), с флагом posix и без него:

# Windows
posix = False
print shlex.split(cmd, posix = posix), posix
# Linux
posix = True
print shlex.split(cmd, posix = posix), posix

Оба случая возвращают одинаковое разделение.

Есть ли метод в subprocess или shlex, который обрабатывает специфические для ОС форматы правильно?

Вот мое текущее решение:

import os
import tempfile
import subprocess
import shlex

# determine OS type
posix = False
if os.name == 'posix':
    posix = True

cmd = 'adb -s  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()

Я не думаю, что shlex.split() здесь что-то делает, и cmd.split() достигает идентичных результатов.

6
задан Nisan.H 17 February 2012 в 02:53
поделиться