#python #expect #xclip
#python #ожидать #xclip
Вопрос:
Это
import pexpect
def run(cmd, stdin):
child = pexpect.spawn(cmd, encoding='utf-8')
child.send(stdin)
child.sendeof()
run('xclip -selection clipboard', 'lol')
следует скопировать строку lol
в мой буфер обмена, чтобы я вставил ее с помощью Ctrl v.
Но вместо этого я получаю поведение echo -n '' | xclip -selection clipboard
, то есть поведение передачи пустого файла в качестве STDIN в xclip
.
Почему?
Обновить
Это выводит lollxl
вместо просто lxl
:
import pexpect
def run(cmd, stdin):
child = pexpect.spawn(cmd, encoding='utf-8')
child.send(stdin)
child.sendeof()
child.sendeof()
x = child.read()
child.wait()
return x
x = run("sed --expression='s/o/x/g'", 'lol')
print(x)
Комментарии:
1. Есть ли причина вообще использовать pexpect для этого вместо чисто функциональности стандартной библиотеки, как в
subprocess.Popen(['xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate('lol')
?2. @CharlesDuffy — единственная причина — иметь единственную
run
функцию, которая работает с другими командами, требующими передачи STDIN, STDOUT и TTY. Если это можно аккуратно сделать без pexpect, я с радостью оставлю это и никогда не оглядываюсь назад.3. Единственное из того, что вы перечислили, что
subprocess
не делает этогоpexpect
, — это предоставление tty (что, честно говоря, не очень распространенная потребность). Однако добавьтеunbuffer
в начало командной строки, и это позаботится о ваших потребностях в tty:subprocess.Popen(['unbuffer', 'xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate('lol')
— хотя я не рекомендую делать это, когда вам действительно не нужен tty, и xclip, безусловно, не требует его.4. Интересно (re:
unbuffer
). Можно ли это легко сделать с использованием чистого Pythonimport pty
?5. Я не знаю — нужно было бы покопаться. На самом деле это звучит как стоящий вопрос о переполнении стека сам по себе.