运行python时,Python POpen Stdout不返回

时间:2018-07-11 21:59:08

标签: python sockets subprocess stdout popen

阅读更新!

我在从子过程模块获取Python POpen的输出时遇到问题。

在“ ls”,“ node”和“ python3 -m pip安装请求”之类的命令上运行良好。

但是,当我运行一个简单的python文件时,例如包含以下内容的“ python3 test.py”:

print("Hello World!")

不输出。也不适用:

sys.stdout.write()

它运行代码,这可以通过将代码放入test.py来证明

f = open("text.txt","w")
f.write("Hello :P")
f.close()

然后将其写入文件就可以了。

这是从主文件中提取的代码:

def executeCmd(cmd):
    filename = "cmdlog_{}.txt".format(cmd.replace(" ","-").replace(".","-").replace("/","-"))
    with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader:
        process = sb.Popen(cmd, stdout=writer,stderr=writer, cwd=oss.getcwd(),shell=True)
        while process.poll() is None:
            rd = reader.read()
            sys.stdout.write(rd.decode("UTF-8"))
            time.sleep(0.1)
        time.sleep(0.5)
        rd = reader.read().decode("UTF-8")
        sys.stdout.write(rd)
        time.sleep(0.5)
        oss.remove(filename)

作为额外信息,该函数被称为线程,来自另一个可从套接字恢复数据的线程。因此,下面的字典“ data”和上面的send函数。

threading.Thread(target=proccessListen,args=([data["cmd"],data["name"]]),daemon=True).start()

我的智慧到此为止,这个问题发生在多个操作系统和机器上。 尚未找到修复程序,也没有相关文章,找不到几个小时的搜索时间,请寻求您的帮助

先谢谢萨姆。


更新: 在玩了1/2个小时的代码并在线搜索以解决新问题之后,我又遇到了障碍。

这是我的新代码:

import io
import sys
import os
import subprocess
import time

def executeCmd(cmd):
    process = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,cwd=os.getcwd(),shell=True)
    print("Started")
    while process.poll() is None:
      line = process.stdout.readline()
      sys.stdout.write(line)
      #process.stdout.flush()
      time.sleep(0.5)
    print("Ended")

executeCmd("python3 test.py")

然后在test.py

print("Hello")
count = 0
import time
while True:
  time.sleep(2)
  count = count + 1
  print("Output: {}".format(count))

问题在于process.stdout.readline()阻止了代码,这意味着它永远无法读取输出,但是为什么呢?取自forum page并进行了修改。都没有问题,都遇到了同样的问题,我已经搜索并解决了许多其他堆栈溢出问题,但没有一个解决方案起作用。我还尝试了使用非阻塞标志的某些事情(我不确定自己在做什么) )。它为其他人工作,但我遇到了OSERROR。尽管这似乎是一条艰难的路。

任何帮助将不胜感激。

谢谢山姆

2 个答案:

答案 0 :(得分:0)

修复只需要一点时间和一些阅读

我要感谢萨尔格。一个很棒的模块!

这是我的代码:

import sarge
import time
import sys

cmd = sarge.run("python3 test.py",async_=True,stdout=sarge.Capture(buffer_size=1))
print("Hello World")
while True:
  time.sleep(0.5)
  sys.stdout.write("." + str(cmd.stdout.read()))
  sys.stdout.flush()

可以修改代码以摆脱b''.

山姆


哦,谢谢你对问题的否决,你已经把我本已苦苦挣扎的代表降到了1。谢谢。

答案 1 :(得分:0)

子进程完成执行后,

process.poll()返回None以外的内容。关于您是否已阅读所有子流程的输出,这完全没说!您需要一直循环调用process.stdout.readline()直到返回空字符串-实际上,在这种情况下,这是您唯一需要的循环,因为process.poll()并没有提供您实际上是在提供任何信息。使用。