Получить вывод сценария оболочки и сохранить в переменную

У меня есть команда оболочки (я запускаю ее на Python), и я хочу получить ее вывод и сохранить его в переменной. Ребята, можете ли вы помочь мне, как это можно сделать?

Это мой код Python...

os.system("unzip -p'" +filepath+"' docProps/app.xml | grep -oP '(?<=\<Pages\>).*(?=\</Pages\>)'"

Между прочим, он получает количество страниц в файле docx. Это работает, но, как я уже сказал, я не знаю, как сохранить его в переменной.

Когда я делаю это:

page_number = os.system("unzip -p'" +filepath+"' docProps/app.xml | grep -oP '(?<=\<Pages\>).*(?=\</Pages\>)'"

Это не возвращает правильное значение.

Огромное спасибо заранее. Я попытался преобразовать это в sub-process.call, но я также не знаю как, потому что я новичок. Еще раз спасибо!

2 ответа

Решение

Вы можете сделать это с subprocess модуль в стандартной библиотеке Python.

import subprocess

command = "unzip -p'" +filepath+"' docProps/app.xml | grep -oP '(?<=\<Pages\>).*(?=\</Pages\>)'"
completed_process = subprocess.run(command, shell=True, text=True, capture_output=True)
output = completed_process.stdout

Обратите внимание, что если вы используете shell=True в subprocess.run() и filepath ввод не является доверенным (например, предоставленным пользователем), у вас есть проблемы с безопасностью, т. е. выполнение произвольного кода. То же самое касается os.system(), Смотрите официальную документацию для возможного решения, используя shlex.quote(),

Вы можете использовать подпроцесс, чтобы получить вывод

import subprocess
s=subprocess.Popen("unzip -p'{0}' docProps/app.xml | grep -oP '(?<=\<Pages\>).*(?=\</Pages\>)'".format(filepath),shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
for line in s.stdout.readlines():
  print line
s.kill()
Другие вопросы по тегам