【发布时间】:2014-10-19 19:36:50
【问题描述】:
我正在使用 subprocess 模块来调用 plink 并在远程服务器上运行一些命令。这按预期工作,但在成功调用 subprocess.check_call 或 subprocess.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_call 和subprocess.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