xclip не получает stdin от pexpect или pexpect не отправляет?

#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 ). Можно ли это легко сделать с использованием чистого Python import pty ?

5. Я не знаю — нужно было бы покопаться. На самом деле это звучит как стоящий вопрос о переполнении стека сам по себе.