Насколько я понимаю, subprocess.Popen() должен создать новый процесс и не блокирует основной.
Однако следующие сценарии не печатаются, пока не закончатся.
Похоже, что задание на печать добавляется после нажатия кнопки, но по какой-то причине не выполняется напрямую. (По крайней мере, Ubuntu показывает добавленное задание на печать.)
Почему происходит такое поведение?
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
lpr = subprocess.Popen("/usr/bin/lpr", # on raspbian: /usr/bin/lp
stdin=subprocess.PIPE,
stdout=subprocess.DEVNULL, # proposed by user elias
close_fds=True) # proposed by user elias
output = "Username: testuser\n".encode() \
+ "Password: p4ssw0rd\n".encode()
lpr.stdin.write(output)
while True:
pass
Приведенный выше скрипт ничего не печатает, даже после того, как он был закрыт с помощью Ctrl-C. (Кажется, что задание на печать остается в очереди.)
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
import time
lpr = subprocess.Popen("/usr/bin/lpr", # on raspbian: /usr/bin/lp
stdin=subprocess.PIPE,
stdout=subprocess.DEVNULL, # proposed by user elias
close_fds=True) # proposed by user elias
output = "Username: testuser\n".encode() \
+ "Password: p4ssw0rd\n".encode()
lpr.stdin.write(output)
time.sleep(20)
Это печатается через 20 секунд (когда скрипт заканчивается).
О среде выполнения:
- os: ubuntu 18.04 (также встречается на raspbian)
- питон: 3.6.5
- принтер: сетевой принтер через CUPS (также происходит при подключении через USB)
РЕШЕНИЕ:
Как видно из комментариев к ответу пользователя elias, такое поведение было вызвано буферизацией.
Проблема решилась закрытием stdin.
lpr.stdin.close()