当前位置: 首页 > 面试题库 >

subprocess.Popen stdin读取文件

汝和裕
2023-03-14
问题内容

在读取文件的一部分后,我尝试在文件上调用进程。例如:

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之前不从中读取任何内容,则此方法很好,但如果我从中读取了任何内容,则子流程将看不到任何内容。这是使用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()报告所有缓冲区大小的第二行开头的位置。由于预读缓冲区错误(使用预期的第二行位置),在Python
2上使用next(file)而不是在我的机器上file.readline()导致file.tell()5K左右。io.open()

file.seek(file.tell())使用默认的基于stdio的文件对象在Python 2上尝试子进程调用前无济于事。它在Python
2上可与,模块中的open()功能一起使用io_pyio在Python 3上可与默认open(也io基于)一起使用。

尝试io_pyio关于Python 2和Python 3具有和不具有模块file.flush()产生不同的结果。它确认
在同一文件描述符上混合缓冲的I / O和非缓冲的I / O不是一个好主意



 类似资料:
  • 工作表列表 全量读取 游标读取 跳过指定行 忽略空白单元格 忽略空白行 忽略跳过动作常量 设置全局读取类型 单元格回调模式读取 数据类型读取 数据类型常量

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 编译 编译时需添加 --enable-reader ./configure --enable-reader 示例 $config = ['path' => './tests']; $excel = new \Vtiful\K

  • 读写文件是很多程序的基本任务,下面我们看看Go里面的文件读取。 package main import ( "bufio" "fmt" "io" "io/ioutil" "os" ) // 读取文件的函数调用大多数都需要检查错误, // 使用下面这个错误检查方法可以方便一点 func check(e error) { if e != nil {

  • 分析网站访问日志应该是一个运维工程师最常见的工作了。所以我们先学习一下怎么用 logstash 来处理日志文件。 Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心 logstash 会漏过你的数据。 sincedb 文件

  • 在7.1节中提到过FileEntry的file方法可以获取到文件的相关信息,实际上file方法返回的是HTML5中的File类型对象,所以有必要先介绍一下HTML5中的FILE对象。 HTML5可以在文件未上传之前在浏览器端获取到文件的相关信息,就是通过File API。当用户通过文件选择控件选择文件后,JavaScript就可以通过控件DOM的files属性获取到对应的File对象: docum

  • 由来 在FileUtil中本来已经针对文件的读操作做了大量的静态封装,但是根据职责分离原则,我觉得有必要针对文件读取单独封装一个类,这样项目更加清晰。当然,使用FileUtil操作文件是最方便的。 使用 在JDK中,同样有一个FileReader类,但是并不如想象中的那样好用,于是Hutool便提供了更加便捷FileReader类。 //默认UTF-8编码,可以在构造中传入第二个参数做为编码 Fi

  • 主要内容:Jsoup 读取文件获取HTML 语法,Jsoup 读取文件获取HTML 说明,Jsoup 读取文件获取HTML 示例以下示例将展示使用文件从磁盘获取 HTML,然后查找其数据。 Jsoup 读取文件获取HTML 语法 document : 文档对象代表 HTML DOM。 Jsoup : 连接 url 并获取 HTML 字符串的主类。 url : 要加载的 html 页面的 url。 Jsoup 读取文件获取HTML 说明 connect(url) 方法建立到 url 的连接,get

  • 问题内容: 我正在尝试读取一个简单的文件,然后再读取一个用户应该选择的文件。我仍然不断遇到以下错误: Readzilla.java:37:找不到符号 symbol:方法FileReader(java.lang.String) 位置:类java.io.BufferedReader 行= read.FileReader(newDoc); 这是代码。 问题答案: 您的问题是这一行: 类上没有命名方法,这