Переписать функцию Python popen2 (php-mail-parsing)

Я пытаюсь переписать popen2 в подпроцесс. Открыть. И я получаю ошибку.

Мой код:

cmd = '/usr/sbin/sendmail -t -i'
if len(sys.argv) == 3:
cmd += " -f%s" % sys.argv[2]

# OLD CODE =======================
#(out, s) = popen2(cmd)
#s.write(data)
#s.close()
# ================================

# NEW CODE =======================

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
(out, s) = (p.stdin, p.stdout)
s.write(data)
s.close()
sys.stdout.flush()

В apache error_log я получаю ошибку:

Traceback (most recent call last):
File "/opt/php-secure-sendmail/secure_sendmail.py", line 80, in <module>
s.write(data)
IOError: File not open for writing
sendmail: fatal: [email protected](10000): No recipient addresses found in message header
plesk sendmail[2576]: sendmail unsuccessfully finished with exitcode 75

Может быть, у кого-то есть идея, как понять этот код?

1

Решение

Вы могли бы использовать .communicate() метод пройти data для дочернего процесса:

cmd = '/usr/sbin/sendmail -t -i'.split()
if len(sys.argv) > 2:
cmd += ["-f", sys.argv[2]]
p = Popen(cmd, stdin=PIPE, close_fds=True)
p.communicate(data)

Обратите внимание, что вам не нужно shell=True Вот.

Я удалил stdout=PIPE потому что я не вижу вывод, используемый в вашем коде. Если вы хотите подавить вывод; увидеть Как скрыть вывод подпроцесса в Python 2.7.

0

Другие решения

Вы пытаетесь писать на стандартный вывод, который открыт только для чтения.

stdout содержит распечатанный вывод нового процесса, вы должны написать в stdin, чтобы отправить ему данные.

popen2 возвращает кортеж (stdout, stdin), поэтому закомментированный код работает.
https://docs.python.org/2/library/popen2.html

Просто измените порядок в вашем кортеже, и он будет работать:

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
(out, s) = (p.stdout, p.stdin)
s.write(data)
s.close()
sys.stdout.flush()
0

По вопросам рекламы [email protected]