Почему перенаправление моего стандартного ввода ('<') не работает с subprocess.Popen ()? - PullRequest
2 голосов
/ 04 июня 2019

Я создаю скрипт на python, и одна его часть должна отправить электронное письмо с файлом в качестве тела сообщения. Вместо отправки содержимого файла скрипт отправляет мне следующий символ, введенный в терминал, например, если я введу c как часть слова «cat», он не поместит c в терминал, а вместо этого отправит мне письмо с телом «c».

Это на CentOS 7.6.1810, с Python 3.5.6.

#!/usr/src/Python-3.5.6/python
import subprocess
import sys
import os

subprocess.Popen(["mail", "-s", "Test Subject", "myemail@myemail.com", "<", "/path/to/file.txt"], stdout=open('stdout', 'w'), stderr=open('errout', 'w'))

Содержимое файла file.txt должно быть отправлено как тело, но я просто получаю первое письмо от того, что я набираю следующим образом. «stdout» после этого читает «EOT», и «errout» ничего не печатает. Чтобы было понятно, я пытаюсь вызвать команду

mail -s "Test Subject" myemail@myemail.com < /path/to/file.txt

изнутри скрипта. Эта команда работает как положено вне скрипта Python, но внутри я сталкиваюсь с проблемой.

1 Ответ

3 голосов
/ 04 июня 2019

subprocess.Popen() выполняет ваш новый процесс напрямую по умолчанию.Таким образом, ваш код передает некоторые дополнительные аргументы < и /path/to/file.txt в исполняемый файл mail, что не приведет к ожидаемому результату.

Перенаправления типа < в системах Unix обрабатываются оболочкой, а некаждым отдельным исполняемым файлом.Вот почему вы хотите, чтобы subprocess.Popen() запустил команду mail со всеми аргументами mail, а также перенаправление < /path/to/file.txt в оболочке.

Это можно сделать с помощью параметра shell=True:

subprocess.Popen(["mail", "-s", "Test Subject", "myemail@myemail.com", "<", "/path/to/file.txt"], stdout=open('stdout', 'w'), stderr=open('errout', 'w'), shell=True)

Обратите внимание, что оболочка, вероятно, не нужна - вы можете Popen открыть файл и подключить mail stdin к этому дескриптору, см. Комментарий anishsane ниже.

Следует избегать использования оболочки, особенно если пользовательские данные передаются дочернему процессу, так как его необходимо должным образом очистить, чтобы предотвратить атаки с использованием команд.

См. Документы Python 3 оsubprocess.Popen .

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