Popen.stdout.readline() 在 Python 3.2 中有效,但 returns 在 Python 3.6 中为空字符串
Popen.stdout.readline() works in Python 3.2 but returns empty string in Python 3.6
我正在使用 Popen 通过 ssh 启动一个 telnet 进程,通过 telnet 发送命令并检查进程的输出以监视 telnet 的状态。我遇到的奇怪的事情是代码在 Python 3.2.3 上工作正常但是当我在 Python 3.6.5 中 运行 它没有代码更改时,它无法获得输出。
我试过了
刷新标准输出
在 stdout.write
后最多等待 10 秒
已检查标准错误
def nonblockingread(sout):
fd = output.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
try:
return sout.read()
except:
return ""
process = Popen(shlex.split("ssh anon@server \"telnet 0 2323\""), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(nonblockingread(process.stdout)) # works for both versions
process.stdin.write(b"start service 4\n")
print(nonblockingread(process.stdout)) # works in 3.2 but not 3.6 (prints empty line)
print(process.stdout.readline()) # also prints empty line in 3.6
缓冲在 3.2.4 and 3.3.1 中默认打开,在 Python 中被无意中关闭 3。您需要 flush
您的 write
到 process.stdin
让对方看到任何东西。
我正在使用 Popen 通过 ssh 启动一个 telnet 进程,通过 telnet 发送命令并检查进程的输出以监视 telnet 的状态。我遇到的奇怪的事情是代码在 Python 3.2.3 上工作正常但是当我在 Python 3.6.5 中 运行 它没有代码更改时,它无法获得输出。
我试过了
刷新标准输出
在 stdout.write
后最多等待 10 秒
已检查标准错误
def nonblockingread(sout):
fd = output.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
try:
return sout.read()
except:
return ""
process = Popen(shlex.split("ssh anon@server \"telnet 0 2323\""), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(nonblockingread(process.stdout)) # works for both versions
process.stdin.write(b"start service 4\n")
print(nonblockingread(process.stdout)) # works in 3.2 but not 3.6 (prints empty line)
print(process.stdout.readline()) # also prints empty line in 3.6
缓冲在 3.2.4 and 3.3.1 中默认打开,在 Python 中被无意中关闭 3。您需要 flush
您的 write
到 process.stdin
让对方看到任何东西。