Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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_Subprocess - Fatal编程技术网

Python 将子流程的输出管道化到文件,然后将其读回

Python 将子流程的输出管道化到文件,然后将其读回,python,subprocess,Python,Subprocess,我有一个python脚本,它运行一个子流程来获取一些数据,然后对其进行处理。我试图实现的是将数据写入文件,然后使用文件中的数据进行处理(原因是子流程很慢,但可以根据我使用的日期、时间和参数进行更改,并且我需要经常运行脚本) 我尝试过各种方法,包括以w+的形式打开文件,并尝试在写操作完成后寻找开始,但似乎没有任何效果-文件被写入,但当我尝试从中读取时(使用file.readline()),我会返回EOF 这就是我想要实现的目标: myFile = open(fileName, "w")

我有一个python脚本,它运行一个子流程来获取一些数据,然后对其进行处理。我试图实现的是将数据写入文件,然后使用文件中的数据进行处理(原因是子流程很慢,但可以根据我使用的日期、时间和参数进行更改,并且我需要经常运行脚本)

我尝试过各种方法,包括以
w+
的形式打开文件,并尝试在写操作完成后寻找开始,但似乎没有任何效果-文件被写入,但当我尝试从中读取时(使用
file.readline()
),我会返回EOF

这就是我想要实现的目标:

      myFile = open(fileName, "w")
      p = subprocess.Popen(args, stdout=myFile)
      myFile.flush()    # force the file to disk
      os.fsync(myFile)  # ..
      myFile.close()

      myFile = open(fileName, "r")
      while myFile.readline():
        pass # do stuff
      myFile.close()
但是,即使文件被正确写入(在脚本运行之后,我可以看到文件的内容),readline也不会返回有效的行。就像我说的,我也尝试过使用相同的文件对象,并对其执行
seek(0)
,但没有成功。这仅在以
r+
的形式打开文件时有效,当文件不存在时失败

任何帮助都将不胜感激。另外,如果有更干净的方法,我愿意:)


PS:我意识到我可以
Popen
stdout
到一个管道中,从管道中读取数据,然后逐行将数据写入文件,但我正在尝试将数据文件的创建与读取分开。

在尝试从文件中读取之前,子过程几乎肯定不会完成。事实上,在您尝试读取文件之前,很可能子流程甚至没有写入任何内容。要实现真正的分离,您必须让子流程写入临时文件,然后替换从中读取的文件,这样您就可以读取以前的版本或新版本,但永远看不到新版本中部分写入的文件


你可以通过多种方式来做到这一点;最简单的方法是更改子流程,但我不知道这是否适合您。或者,您可以将其包装在自己的单独脚本中以管理文件。您可能也不想在分析输出文件的脚本中调用子流程;您需要定期重新生成cronjob或其他内容。

如果子流程及时完成,则应该可以这样做(请参见James的答案)

如果要等待它完成,请在
Popen
调用之后添加
p.wait()

然而,您的实际while循环是什么<代码>而myFile.readline()使您看起来好像没有实际保存任何内容的行。试试这个:

myFile = open(fileName, "r")
print myFile.readlines()
myFile.close()
或者,如果要以交互方式检查程序的状态:

myFile = open(fileName, "r")
import pdb; pdb.set_trace()
myFile.close()

然后,您可以在停止后执行诸如打印myFile.readlines()之类的操作。

@James Aylett为我指出了正确的路径,似乎我的问题是调用.flush()时subprocess.Popen没有完成运行

解决方案是在subprocess.Popen调用之后立即调用p.wait(),以允许底层命令完成。这样做之后,.flush做了正确的事情(因为所有的数据都在那里),我可以继续读取文件

因此,上述代码变为:

  myFile = open(fileName, "w")
  p = subprocess.Popen(args, stdout=myFile)

  p.wait()          # <-- Missing line

  myFile.flush()    # force the file to disk
  os.fsync(myFile)  # ..
  myFile.close()

  myFile = open(fileName, "r")
  while myFile.readline():
    pass # do stuff
  myFile.close()
myFile=open(文件名,“w”)
p=subprocess.Popen(args,stdout=myFile)

p、 等等()#你在linux机器上吗?如果是的话,你有没有试着给a写信?我没有。我会研究它,虽然我确实需要在某个时候将该文件写入磁盘。让执行读取的进程也将其作为日志写入磁盘。不幸的是,正如我在P.S.中提到的,我正在尝试将两者分开,因为写入部分并不总是发生。不,我是指读取FIFO的过程。不管它收到什么,它都会处理,但它也会将它写入某种日志文件。谢谢,这让我走上了正确的轨道。事实证明,我可以在Popen之后调用p.wait(),而.flush()将完成它的工作,这样我就可以再次读取文件了!