Сохранить отфильтрованный вывод команды cmd в переменной - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь сохранить вывод команды cmd как переменную в python.Для достижения этого я использую os.system(), но os.system() просто запускает процесс, но не захватывает вывод.

import os


PlatformName = os.system("adb shell getprop | grep -e 'bt.name'")
DeviceName = os.system("adb shell getprop | grep -e '.product.brand'")
DeviceID = os.system("adb shell getprop | grep -e 'serialno'")
Version = os.system("adb shell getprop | grep -e 'version.release'")

print(PlatformName)
print(DeviceName)
print(DeviceID)
print(Version)

Затем я попытался использовать модуль subprocess.

import subprocess
import os


PlatformName = subprocess.check_output(["adb shell getprop | grep -e 'bt.name'"])
DeviceName = subprocess.check_output(["adb shell getprop | grep -e '.product.brand'"])
DeviceID = subprocess.check_output(["adb shell getprop | grep -e 'serialno'"])
Version = subprocess.check_output(["adb shell getprop | grep -e 'version.release'"])

print(PlatformName)
print(DeviceName)
print(DeviceID)
print(Version)

Я получаю следующую ошибку

FileNotFoundError: [WinError 2]Системе не удается найти указанный файл

Как сохранить выходные данные команды в виде переменной?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Эй, у меня та же проблема, что и у тебя. Подпроцесс может делать то, что вы хотите, даже с shell=False. Хитрость заключается в методе connect () .

with subprocess.Popen(cmdCode,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE,
                            cwd = workingDir,
                            bufsize=1,
                            universal_newlines = True) as proc:
    #output is stored in proc.stdout
    #errors are stored in proc.stderr

Теперь вам просто нужна небольшая функция для сканирования proc.stdout на необходимую вам информацию: PlatformName и т. Д.

0 голосов
/ 17 сентября 2018

Проблемы здесь:

  • передача таких аргументов (строка в списке, с пробелами) действительно не рекомендуется
  • передача таких аргументов требует shell=True для этогоимеют небольшой шанс на работу, и shell=True известен проблемами безопасности (и другими проблемами, такими как непереносимость)
  • grep не является стандартным для окон, и шаблон является регулярным выражением, котороеозначает, что вам, вероятно, придется сбежать . ("bt\.name").
  • , если не найден grep возвращает 1 и приведет к ошибке check_output.
  • при обнаружении grepвозвращает совпадение (я) и символ новой строки, которые вам необходимо удалить

Я бы переписал это:

PlatformName = subprocess.check_output(["adb shell getprop | grep -e 'bt.name'"])

как:

output = subprocess.check_output(["adb","shell","getprop"])
platform_name = next((line for line in output.decode().splitlines() if "bt.name" in line),"")

Вторая строка - это «нативная» версия grep (без регулярных выражений).Возвращает первое вхождение «bt.line» в выходных строках или пустую строку, если не найдено.

Вам не нужно grep здесь (вышеприведенное не является строго эквивалентным, так как оно дает первое происшествие, а не все происшествия, но в вашем случае все должно быть в порядке).И у ваших клиентов может не быть установлен grep в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...