在 Python 中查看 Popen 管道流

2024-03-15

背景:
Linux 上的 Python 2.6.6。 DNA 序列分析流程的第一部分。
我想从已安装的远程存储(LAN)读取可能经过 gzip 压缩的文件,以及它是否经过 gzip 压缩; gunzip 将其压缩到流中(即使用gunzip FILENAME -c),如果流(文件)的第一个字符是“@”,则将该整个流路由到一个在标准输入上获取输入的过滤程序,否则只需将其直接通过管道传输到本地磁盘上的文件。我想最大限度地减少从远程存储读取/查找文件的数量(仅一次通过文件应该不是不可能的?)。

示例输入文件的内容,前四行对应于 FASTQ 格式的一条记录:

@I328_1_FC30MD2AAXX:8:1:1719:1113/1                                        
GTTATTATTATAATTTTTTACCGCATTTATCATTTCTTCTTTATTTTCATATTGATAATAAATATATGCAATTCG
+I328_1_FC30MD2AAXX:8:1:1719:1113/1                                        
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhahhhhhhfShhhYhhQhh]hhhhffhU\UhYWc

不应通过管道传输到过滤程序的文件包含如下所示的记录(前两行对应于 FASTA 格式的一条记录):

>I328_1_FC30MD2AAXX:8:1:1719:1113/1
GTTATTATTATAATTTTTTACCGCATTTATCATTTCTTCTTTATTTTCATATTGATAATAAATATATGCAATTCG

有些人编写了半伪代码来可视化我想要做的事情(我知道按照我编写的方式这是不可能的)。我希望这有一定道理:

if gzipped:
    gunzip = Popen(["gunzip", "-c", "remotestorage/file.gz"], stdout=PIPE)
    if gunzip.stdout.peek(1) == "@": # This isn't possible
        fastq = True
    else:
        fastq = False
if fastq:
    filter = Popen(["filter", "localstorage/outputfile.fastq"], stdin=gunzip.stdout).communicate()
else:
    # Send the gunzipped stream to another file

忽略这样一个事实:代码不会像我在这里编写的那样运行,并且我没有错误处理等,所有这些都已经在我的其他代码中了。我只是想要帮助查看流或找到解决方法。如果你能的话我会很棒gunzip.stdout.peek(1)但我意识到这是不可能的。

到目前为止我尝试过的:
我认为 subprocess.Popen 可能会帮助我实现这一目标,并且我尝试了很多不同的想法,其中包括尝试使用某种 io.BufferedRandom() 对象来写入流,但我不知道如何做到这一点会工作。我知道流是不可搜索的,但也许解决方法可能是读取gunzip流的第一个字符,然后创建一个新流,在其中首先根据文件内容输入“@”或“>”,然后填充其余部分将gunzip.stdout-stream添加到新流中。然后,这个新流将被输入到过滤器的 Popen 标准输入中。

请注意,文件大小可能比可用内存大几倍。我不想从远程存储中执行多次源文件读取,也不想进行不必要的文件访问。

欢迎任何想法!请向我提问,如果我说得不够清楚,我可以澄清。


这是您的实现首先根据文件内容输入“@”或“">”,然后将gunzip.stdout-stream的其余部分填充到新流中提议。我只测试了测试的本地文件分支,但它应该足以演示这个概念。

if gzipped:
    source = Popen(["gunzip", "-c", "remotestorage/file.gz"], stdout=PIPE)
else:
    source = Popen(["cat", "remotestorage/file"], stdout=PIPE)
firstchar = source.stdout.read(1)
# "unread" the char we've just read
source = Popen([r"(printf '\x%02x' && cat)" % ord(firstchar)],
               shell=True, stdin=source.stdout, stdout=PIPE)

# Now feed the output to a filter or to a local file.
flocal = None
try:
    if firstchar == "@":
        filter = Popen(["filter", "localstorage/outputfile.fastq"],
                       stdin=source.stdout)
    else:
        flocal = open('localstorage/outputfile.stream', 'w')
        filter = Popen(["cat"], stdin=source.stdout, stdout=flocal)
    filter.communicate()
finally:
    if flocal is not None:
        flocal.close()

这个想法是从源命令的输出中读取单个字符,然后使用重新创建原始输出(printf '\xhh' && cat),有效实现peek。替换流指定shell=True to Popen,将其留给 shell 并cat做繁重的工作。数据始终保留在管道中,永远不会完全读入内存。请注意,仅在单次调用时请求 shell 的服务Popen它实现了不读取所查看的字节,而不是涉及用户提供的文件名的调用。即使在这一点上,该字节也会转义为十六进制,以确保 shell 在调用时不会破坏它printf.

可以进一步清理代码以实现名为的实际函数peek返回所查看的内容和替换内容new_source.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中查看 Popen 管道流 的相关文章

随机推荐

  • C# 中的冗余?

    采取以下片段 List
  • com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException:当 autocommit=true 时无法调用回滚

    我在我的应用程序中使用 Jboss 5 0 和 mysql 并且会有很多并发操作 并且数据库包含相当多的记录 这个错误经常出现 时不时地 com mysql jdbc exceptions MySQLNonTransientConnecti
  • 如何在 NodeJs 中运行 SOAP 请求?

    起初这听起来像是一个重复的问题 但我已经浏览了我找到的所有博客 教程 视频 但没有一个真正说明了如何运行该请求 示例 对于 RESTful 请求 您在 NodeJs 中编码 点击路由 https localhost 3000 api get
  • 如何使用 junit 测试 if 语句?

    我似乎无法在网上找到任何解决此问题的教程 我有这个if陈述 if basket getCustomerId null Basket exBasket findBasketByCustomerId basket getCustomerId i
  • 如何使用点击手势显示/隐藏 pageViewController 上的状态栏(iOS8 / Swift)

    浏览所有类似问题的解决方案 我一直试图得到statusBar通过点击手势显示 隐藏 我已经设定View controller based status bar appearance NO在 plist 中 我在我的中尝试了以下代码DataV
  • HTML / CSS:遇到有关网站宽度/高度的问题

    我正在建立一个网站 为人们访问的区域做广告 作为我自己的一项任务 我花了一些时间尝试将迄今为止所做的所有工作都放在一页上 我希望没有滚动条 我不想让滚动条不可见等等 我的意思是让网页适合浏览器的一页 而用户无需出于美观目的而滚动 我尝试过调
  • 如何在Windows服务中检测从睡眠模式唤醒?

    再会 我编写了一个 Windows 服务 它检测 USB 闪存驱动器连接并对连接的驱动器执行某些操作 现在经过测试 我需要在从睡眠模式唤醒后重新处理设备 当服务作为 Windows 程序工作时 我解决了这个问题 为了解决我另外处理DBT D
  • 从 Haskell 代码生成 LLVM IR

    我的目标是获取不同语言 主要是 C C Obj C 和 Haskell 的源代码 并提供有关它们的各种统计信息 例如变量 函数 内存分配 复杂性等的数量 LLVM 似乎是一个完美的工具 因为我可以为这些语言生成位码 并且通过 LLVM 的可
  • .NET 中的别名

    是否可以为现有类型创建别名并在整个项目中使用该别名 例如 创建 CustomerID System UInt32 并使用 CustomerID 作为数据类型 版本 NET Framework 4 0 使用 using 关键字 我们可以创建别
  • Jibx - 如何使用值和属性解组/编组标签?

  • Windows 应用商店应用程序和 F#

    我正在尝试使用 F 创建一个可移植库以与 Windows 应用商店应用程序一起使用 我用一个类创建了一个 fs 文件 module FunctionalRT open System Net open System IO type WebHe
  • Xcode 10 - 界面生成器文档

    我无法将现有故事板的 Interface Builder Document 版本更改为 Xcode 10 0 选择 Xcode 10 0 出现提示时保存并关闭并重新打开我的故事板后 它总是恢复到 Xcode 9 0 即使创建新的故事板 它也
  • 在 MongoDb 中,如何对文档中存在的内部字段进行排序?

    我的文档看起来像这样 field1 somevalue name xtz nested documents array of nested document x 1 y 2 first nested document x 2 y 3 sec
  • 在R中使用正则表达式捕获字符串的一部分

    我有这些字符串 myseq lt c ALM GSK LN 06 ID AS04 LV 06 ID png AS04 SP 06 IP png 我想做的是捕获序列的一部分 ALM GSK LN ID AS04 LV ID AS04 SP I
  • ASP.NET + 访问路径被拒绝

    我有一个 ASP NET 应用程序 它尝试在运行时在 Web 服务器上写入文件 在我的开发环境中 这是有效的 但是 当我将其部署到生产服务器并执行代码时 我收到一条错误消息 Access to the path C Inetpub wwwr
  • 活动更改之前的动画

    我试图做一些简单的事情 但我不明白为什么它不起作用 我想做的是 当我触摸 ImageView 时 它会在上面显示动画 然后 只有当该动画结束时 它才会开始新的活动 相反 发生的情况是新活动立即开始并且不显示动画 这是动画 xml
  • java swing中N个jtable的同步滚动

    我需要将 N 个表并排排列在网格窗格中 前提是所有 jtable 的滚动窗格高度保持相同 现在我想同步所有 jtable 的滚动 这意味着如果我滚动第一个 jtable 那么其余的 jtable 应该自动滚动相同的量 有人对此有任何想法吗
  • Net::HTTP 对 HTTPS 请求的响应极其缓慢

    由于某种原因 在我的开发机器上 通过 Net HTTP 执行的 HTTPS 请求的响应非常非常慢 我尝试过 RestClient 和 HTTParty 它们都有同样的问题 它似乎不知从何而来 我已经提出了数百次这些请求 没有任何问题 但今天
  • Sql连接查询

    我有三张桌子 tblLink LinkId LinkName GroupId SubGroupId GroupId 和 SubGroupId 是 tblGroup 和 tblSubGroup 中的外键tblGroup 组ID 组名称 tbl
  • 在 Python 中查看 Popen 管道流

    背景 Linux 上的 Python 2 6 6 DNA 序列分析流程的第一部分 我想从已安装的远程存储 LAN 读取可能经过 gzip 压缩的文件 以及它是否经过 gzip 压缩 gunzip 将其压缩到流中 即使用gunzip FILE