运行Python时Python POpen标准不返回
阅读更新强> 从SubAccess模块获取Python POpen的输出时遇到问题 它在诸如“ls”、“node”和“python3-m pip安装请求”等命令上运行良好 但是,当我运行一个简单的python文件时,例如“python3 test.py”,它包含:运行Python时Python POpen标准不返回,python,sockets,subprocess,stdout,popen,Python,Sockets,Subprocess,Stdout,Popen,阅读更新 从SubAccess模块获取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("H
print("Hello World!")
它不输出。它也不适用于:
sys.stdout.write()
它运行代码,这可以通过将代码放在test.py中来证明
f = open("text.txt","w")
f.write("Hello :P")
f.close()
print("Hello")
count = 0
import time
while True:
time.sleep(2)
count = count + 1
print("Output: {}".format(count))
它可以很好地写入文件
以下是从主文件中提取的代码:
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中
f = open("text.txt","w")
f.write("Hello :P")
f.close()
print("Hello")
count = 0
import time
while True:
time.sleep(2)
count = count + 1
print("Output: {}".format(count))
问题是process.stdout.readline()阻塞了代码,这意味着它永远无法读取输出,但为什么呢。这是从a中提取并修改的。两者都不起作用,都是同一个问题,我搜索并浏览了许多其他堆栈溢出问题,但没有一个解决方案起作用。我还尝试了一些带有非阻塞标志的方法(我不确定我在做什么)。它对其他人有效,但我有一个错误。尽管这看起来很难走
任何帮助都将不胜感激
谢谢Sam修理只花了整整一天的时间和一些阅读 我要感谢中士。一个伟大的模块 这是我的密码:
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。谢谢。process.poll()在子流程完成执行后,将返回除“无”之外的其他内容。这绝对不能说明您是否已经阅读了子流程的所有输出!您需要在循环中不断调用
process.stdout.readline()
,直到它返回一个空字符串——事实上,这是本例中唯一需要的循环,因为process.poll()
没有提供您实际使用的任何信息。您能删除所有不相关的内容并给我们一个简单的解决方案,以便我们可以运行和调试您的代码吗?好的-按要求完成,我假设您在顶部有明显的导入,再加上作为oss导入os
(以及导入os
)如果是这样,当我在macOS和Ubuntu上以Python 2.7、3.6或3.7运行此代码时,它可以工作。是的-很抱歉忘记添加它们,我现在就添加。别忘了