gpt4 book ai didi

python - subprocess.Popen 标准输入读取文件

转载 作者:太空狗 更新时间:2023-10-29 18:25:40 25 4
gpt4 key购买 nike

我试图在文件的一部分被读取后调用一个进程。例如:

with open('in.txt', 'r') as a, open('out.txt', 'w') as b:
header = a.readline()
subprocess.call(['sort'], stdin=a, stdout=b)

如果我在执行 subprocess.call 之前没有从 a 中读取任何内容,这会很好地工作,但是如果我从中读取任何内容,子进程将看不到任何内容。这是使用 python 2.7.3。我在文档中找不到任何解释此行为的内容,而且(非常)简短地浏览一下子流程源代码也没有发现原因。

最佳答案

如果您打开无缓冲的文件,那么它可以工作:

import subprocess

with open('in.txt', 'rb', 0) as a, open('out.txt', 'w') as b:
header = a.readline()
rc = subprocess.call(['sort'], stdin=a, stdout=b)

subprocess 模块在文件描述符级别(操作系统的低级无缓冲 I/O)工作。它可以与 os.pipe()socket.socket()pty.openpty() 以及任何具有有效 的对象一起使用.fileno() 方法,如果操作系统支持的话。

不建议在同一文件中混合使用缓冲和非缓冲 I/O。

在 Python 2 上,file.flush() 导致输出出现例如:

import subprocess
# 2nd
with open(__file__) as file:
header = file.readline()
file.seek(file.tell()) # synchronize (for io.open and Python 3)
file.flush() # synchronize (for C stdio-based file on Python 2)
rc = subprocess.call(['cat'], stdin=file)

问题可以在没有 subprocess 模块的情况下通过 os.read() 重现:

#!/usr/bin/env python
# 2nd
import os

with open(__file__) as file: #XXX fully buffered text file EATS INPUT
file.readline() # ignore header line
os.write(1, os.read(file.fileno(), 1<<20))

如果缓冲区较小,则打印文件的其余部分:

#!/usr/bin/env python
# 2nd
import os

bufsize = 2 #XXX MAY EAT INPUT
with open(__file__, 'rb', bufsize) as file:
file.readline() # ignore header line
os.write(2, os.read(file.fileno(), 1<<20))

如果第一行大小不能被 bufsize 整除,它会消耗更多的输入。

默认的 bufsizebufsize=1(行缓冲)在我的机器上表现相似:文件的开头消失了——大约 4KB。

file.tell() 报告所有缓冲区大小的第 2 行开头的位置。使用 next(file) 而不是 file.readline() 导致 file.tell() 在我的 Python 2 机器上大约 5K 由于read-ahead buffer bug (io.open() 给出了预期的第二行位置)。

在子进程调用之前尝试 file.seek(file.tell()) 对使用默认的基于 stdio 的文件对象的 Python 2 没有帮助。它与 io 中的 open() 函数一起工作,Python 2 上的 _pyio 模块和默认的 open(也io-based) 在 Python 3 上。

在使用和不使用 file.flush() 的情况下,在 Python 2 和 Python 3 上尝试 io_pyio 模块会产生各种结果。它证实在同一个文件描述符上混合缓冲和非缓冲 I/O 不是一个好主意

关于python - subprocess.Popen 标准输入读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com