阅读更新!
我在从子过程模块获取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。尽管这似乎是一条艰难的路。
任何帮助将不胜感激。
谢谢山姆
答案 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()
并没有提供您实际上是在提供任何信息。使用。