Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行Python时Python POpen标准不返回_Python_Sockets_Subprocess_Stdout_Popen - Fatal编程技术网

运行Python时Python POpen标准不返回

运行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

阅读更新

从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("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运行此代码时,它可以工作。是的-很抱歉忘记添加它们,我现在就添加。别忘了