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 .