【问题标题】:Python raw_input doesn't work after using subprocess module使用子进程模块后 Python raw_input 不起作用
【发布时间】:2014-10-19 19:36:50
【问题描述】:

我正在使用 subprocess 模块来调用 plink 并在远程服务器上运行一些命令。这按预期工作,但在成功调用 subprocess.check_callsubprocess.check_output 后,raw_input 方法似乎永远阻塞并且不接受命令行输入。

我把它简化为这个简单的例子:

import subprocess

def execute(command):
    return subprocess.check_call('plink.exe -ssh ' + USER + '@' + HOST + ' -pw ' + PASSWD + ' ' + command)

input = raw_input('Enter some text: ')
print('You entered: ' + input)

execute('echo "Hello, World"')

# I see the following prompt, but it's not accepting input
input = raw_input('Enter some more text: ')
print('You entered: ' + input)

我看到subprocess.check_callsubprocess.check_output 的结果相同。如果我将最后的raw_input 调用替换为从标准输入 (sys.stdin.read(10)) 的直接读取,则程序确实接受输入。

这是 Windows 7 x64 上的 Python 2.7。任何想法我做错了什么?'

编辑:如果我将 execute 更改为调用 plink 以外的其他名称,它似乎可以正常工作。

def execute(command):
    return subprocess.check_call('cmd.exe /C ' + command)

这表明 plink 可能是问题所在。但是,我可以直接在控制台窗口中运行多个 plink 命令而不会出现问题。

【问题讨论】:

  • 我没有 Windows 机器来测试这个,也不能在这里复制它,但是你有没有尝试将 close_fds=True 传递给 subprocess.check_call 函数?
  • 刚刚试了一下,得到了同样的结果。
  • 我无法在我的 Windows 机器上重现它。如果您运行 plink 以外的程序,会发生这种情况吗?我想知道 plink 是否以某种奇怪的方式干扰了终端,最终破坏了raw_input
  • 好主意。试过了,它似乎工作正常。不确定 plink 在做什么。

标签: python python-2.7 subprocess plink


【解决方案1】:

我能够通过将标准输入附加到 devnull 来解决这个问题:

def execute(command):
    return subprocess.check_call('plink.exe -ssh ' + USER + '@' + HOST + ' -pw ' + PASSWD + ' ' + command, stdin=open(os.devnull))

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2013-06-25
    • 2019-06-17
    • 2013-10-15
    相关资源
    最近更新 更多