Подтвердить что ты не робот

Pexpect и PyCharm - Несоответствующий ioctl для устройства

Я пытаюсь запустить базовый Pexpect script:

import pexpect
ftp_process = pexpect.spawn('ftp')
ftp_process.interact()

Когда код запускается непосредственно с терминала, код работает так, как ожидалось. Если я запустил код с помощью PyCharm run/debug, я получаю следующую ошибку:

Traceback (most recent call last):
  File "/path/to/code/test.py", line 3, in <module>
    ftp_process.interact()
  File "/usr/local/lib/python3.4/site-packages/pexpect/__init__.py", line 1645, in interact
    mode = tty.tcgetattr(self.STDIN_FILENO)
termios.error: (25, 'Inappropriate ioctl for device')

Кажется, что взаимодействие Pexpect с окном запуска/отладки PyCharm не работает по умолчанию. Есть ли способ исправить это с помощью определенной настройки PyCharm? Если нет, есть ли другой способ обойти это?

ИЗМЕНИТЬ

Приведенный выше код - это просто сокращенный пример, который приводит к проблеме. Остальные возможности pexpect (такие как expect(), sendline() и т.д.) По-прежнему желательны.

4b9b3361

Ответ 1

Примечание. Это только обходной путь, но он работает.

Если script вызывается из псевдо-tty с помощью отдельного script, то желаемые результаты могут быть достигнуты. Например, используя pty.spawn("python my_script.py".split()), где my_script.py используется с помощью pexpect.

Я счел разумным иметь один script, который сначала пытается вызвать вызовы pexpect в пределах try/except, и после обнаружения ошибки, script напомнит себя внутри псевдо-tty.

Кредит принадлежит Ю.Ф. Себастьяну в комментариях к исходному вопросу.

Ответ 2

Попробуйте что-то, что можно выделить Pseudo TTYs. Это должно трюк ftp в мысли, что у него есть TTY (что-то, что дается при запуске Python REPL с терминала). Пример:

pexpect.pty.spawn('ftp')

Вы также можете попробовать ptyprocess, хотя я не могу ручаться за правильность/находиться в рабочем состоянии.

Ответ 3

Похоже, что pexpect установлен правильно на вашей установке Python по умолчанию, может быть другой экземпляр python, у которого может быть установлена ​​или установлена ​​некорректная библиотека pexpect. В настройках PyCharm попробуйте указать его по умолчанию/правильную установку python.