Получить вывод сценария оболочки и сохранить в переменную
У меня есть команда оболочки (я запускаю ее на 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()