【问题标题】:Popen.stdout.readline() works in Python 3.2 but returns empty string in Python 3.6Popen.stdout.readline() 在 Python 3.2 中工作,但在 Python 3.6 中返回空字符串
【发布时间】:2019-09-14 06:51:29
【问题描述】:

我正在使用 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

【问题讨论】:

  • 为什么要写入可读的 process.stdout 而不是可写的 process.stdin?
  • 打错字了
  • 似乎缺少一些代码——例如,您从未设置任何非阻塞的东西。你的“服务 4”真的启动了吗?

标签: python python-3.6 python-3.2


【解决方案1】:

缓冲在3.2.4 and 3.3.1中默认开启,在Python 3中被无意关闭。你需要flush你的writeprocess.stdin才能看到任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2016-12-31
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2017-08-13
    相关资源
    最近更新 更多