【问题标题】:pexpect's interact() reported "Inappropriate ioctl for device" when running on a VM with PowerCLI在具有 PowerCLI 的 VM 上运行时,pexpect 的 interact() 报告“设备的 ioctl 不合适”
【发布时间】:2016-12-29 18:25:42
【问题描述】:

我有一个简单的脚本 (child.py),如下所示:

#!/usr/bin/env python
import pexpect

def ency():
    child = pexpect.spawn("cryptsetup luksChangeKey /mnt/ency")
    child.expect('Enter passphrase to be changed:')
    child.sendline('password-old')
    child.expect('Enter .*: ')
    child.sendline('password-new')
    child.expect('Verify .*: ')
    child.sendline('password-new')
    child.interact()

ency()

我使用不同的脚本 (master.sh) 调用此脚本

#!/bin/bash
python child.py 

当我运行child.py 时代码运行成功,但是当我使用master.sh 调用child.py 时,出现以下错误:

Traceback (most recent call last):
  File "child.py", line 15, in <module>
    ency()
  File "child.py", line 13, in ency
    child.interact()
  File "/usr/lib/python2.7/site-packages/pexpect-4.2.1-py2.7.egg/pexpect/pty_spawn.py", line 740, in interact
    mode = tty.tcgetattr(self.STDIN_FILENO)
termios.error: (25, 'Inappropriate ioctl for device')

请注意,我正在使用 PowerCLI 调用 master.sh。我还尝试使用 PowerCLI 的 Invoke-vmscript –vm vmname –scripttext “python child.py” 直接调用 child.py 并且仍然得到相同的行为。

关于如何解决此问题的任何想法或建议?

谢谢

【问题讨论】:

  • master.py 是一个 shell 脚本吗?为什么python child.py?
  • master 是 python 文件,child 是 bash 脚本。我编辑了我的问题以反映这一点。感谢您指出这一点。
  • master 是一个 python 文件,child 是一个 bash 脚本,你确定这不是 @Taleeb 的相反方式吗?还有,你怎么称呼master.py?
  • stackoverflow.com/a/1402389/2988730。不是骗子,只是一个可能的解决方案。
  • @Gabriel。 cryptsetup 是 LUKS 管理套件的一部分。如果您没有安装该程序,请尝试针对您拥有的其他一些需要一组重要输入的程序运行。

标签: python python-2.7 tty pexpect


【解决方案1】:

由于您在 VM 上运行 pexpect 脚本,我想您实际上并不需要 interact 使用它。所以只需替换

child.interact()

与

child.expect(pexpect.EOF)  # also use the `timeout` argument if necessary

等待子完成。


根据文档,interact()

将子进程的控制权交给交互式用户(人类在键盘上)。击键被发送到子进程,...

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 2018-09-07
    • 2010-12-08
    • 1970-01-01
    • 2014-09-17
    • 2017-08-20
    • 2015-02-03
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多