【问题标题】:Pexpect and PyCharm - Inappropriate ioctl for devicePexpect 和 PyCharm - 不适合设备的 ioctl
【发布时间】:2015-10-30 00:40:21
【问题描述】:

我正在尝试运行一个基本的 Pexpect 脚本:

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

当代码直接从终端运行时,代码会按预期工作。如果我使用 PyCharm 的运行/调试运行代码,我会收到以下错误:

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() 等)仍然需要。

【问题讨论】:

  • PyCharm 必须提供伪 tty (pty) 而不是管道,例如,代码在 Emacs 中运行良好。你可以试试pty.spawn('ftp')
  • @J.F.Sebastian,这是一个答案,它有效。
  • @J.F.Sebastian:pty 适用于这种情况,但这实际上只是一个简化的示例。我仍然需要 pexpect 的力量。我不知道如何让 PyC​​harm 提供伪 tty,但也许回答这个问题的人会知道。
  • 试试pty.spawn("python your_script.py".split()),其中your_script.py使用pexpect
  • @J.F.Sebastian:这确实有效。它不是特别干净(与更改 IDE 等中可能存在的某些设置相比),但我会看看它是否是我得到的唯一可行的解​​决方案。

标签: python python-3.x pycharm pexpect


【解决方案1】:

注意:这只是一种解决方法,但确实有效。

如果通过使用单独的脚本从伪 tty 调用脚本,则可以获得所需的结果。例如,使用pty.spawn("python my_script.py".split()),其中my_script.py 是使用pexpect 的那个。

我发现有一个脚本是合理的,它最初在 try/except 内尝试调用 pexpect,并在发现错误后,让脚本在伪 tty 中自行调用。

在原始问题的 cmets 中归功于 J.F. Sebastian。

【讨论】:

    【解决方案2】:

    尝试一些可以分配Pseudo TTYs的东西。这应该会让ftp 认为它有一个 TTY(这是从终端运行 Python REPL 时给出的)。示例:

    pexpect.pty.spawn('ftp')
    

    您也可以尝试ptyprocess,尽管我不能保证它的正确性/处于工作状态。

    【讨论】:

    • 您知道pty_spawn 函数的任何文档吗?我只看到这个名称的文件,其中包含我已经在使用的 spawn 函数,并且尝试调用此函数会导致 'module' object has no attribute 错误。
    • 对不起,应该是pexpect.pty.spawn
    • 现在确实会生成进程,但之后无法使用其他 pexpect 命令(expect、sendline 等),因为程序似乎正在等待 pty 调用完成。关于如何通过这种方法实现这一点的任何想法?
    • 如果您想以编程方式对其进行操作,那么我猜ptyprocess 是最好的选择。
    【解决方案3】:

    看起来 pexpect 已正确安装在您的默认 Python 安装中,可能有另一个 Python 实例可能未正确安装或安装 pexpect 库。在您的 PyCharm 设置中,尝试将其指向您的默认/正确 python 安装。

    【讨论】:

    • 感谢您的回复,但这似乎没有发生,因为 Pexpect 安装或 PyCharm 正在使用哪个解释器存在问题。 PyCharm 的运行/调试的“终端”如何与 Pexpect 通信似乎是一个问题。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2014-09-17
    • 2015-02-03
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多