使用 Python 的 Popen 替换 Bash 风格的进程

2024-06-23

在 Bash 中,您可以轻松地将进程的输出重定向到临时文件描述符,并且所有这些都由 bash 自动处理,如下所示:

$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")

或者像这样:

$ wc -l <(ls)
15 /dev/fd/63

看看它为什么不是标准输入重定向:

$ vim <(echo "Hello World") 
vim opens a text file containing "Hello world"
$ echo  "Hello World" | vim
Vim: Warning: Input is not from a terminal

您可以在第二个示例中看到 bash 如何自动创建文件描述符并允许您将程序的输出传递到另一个程序。

现在我的问题是:我怎样才能用Python做同样的事情,在子进程模块中使用Popen?

我一直在使用普通的 kmers 文件并只是将其读入,但我的程序现在根据用户参数在运行时生成特定的 kmers 列表。我想避免手动写入临时文件,因为处理文件权限可能会给我的原始用户带来问题。

这是我的代码,用于运行我的程序并使用实际文件“kmer_file”捕获标准输出

input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)

我创建了一个名为generate_kmers的函数,它返回一个可以轻松写出到文件(包括换行符)或StringIO的字符串。我还有一个独立的 python 脚本可以做同样的事情

所以现在我想将它作为我的第三个参数传递:

这不起作用:

kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)

这也不是:

kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file.stdout], stdout=PIPE)

所以我没有主意了。

有谁知道解决这个问题的好方法吗?我正在考虑使用 shell=True 选项并使用

谢谢你!


If pram_axdnull明白"-"约定的意思是:“从标准输入读取”那么你可以:

p = Popen(["pram_axdnull", str(kmer), input_filename, "-"],
          stdin=PIPE, stdout=PIPE)
output = p.communicate(generate_kmers(3))[0]

如果输入是由外部进程生成的:

kmer_proc = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
p = Popen(["pram_axdnull", str(kmer), input_filename, "-"],
          stdin=kmer_proc.stdout, stdout=PIPE)
kmer_proc.stdout.close()
output = p.communicate()[0]

If pram_axdnull doesn't理解"-"习俗:

import os
import tempfile
from subprocess import check_output

with tempfile.NamedTemporaryFile() as file:
    file.write(generate_kmers(3))
    file.delete = False

try:
    p = Popen(["pram_axdnull", str(kmer), input_filename, file.name],
              stdout=PIPE)
    output = p.communicate()[0]
    # or
    # output = check_output(["pram_axdnull", str(kmer), input_filename, 
                             file.name])
finally:
    os.remove(file.name)

使用外部进程生成临时文件:

from subprocess import check_call

with tempfile.NamedTemporaryFile() as file:
    check_call(["generate_kmers", str(kmer)], stdout=file)
    file.delete = False

为了避免等待生成所有 kmers,即同时写入/读取 kmers,您可以使用os.mkfifo()在 Unix 上(由 @cdarke 建议):

import os
import shutil
import tempfile
from contextlib import contextmanager
from subprocess import Popen, PIPE

@contextmanager
def named_pipe():
    dirname = tempfile.mkdtemp()
    try:
        path = os.path.join(dirname, 'named_pipe')
        os.mkfifo(path)
        yield path
    finally:
        shutil.rmtree(dirname)

with named_pipe() as path:
    p = Popen(["pram_axdnull", str(kmer), input_filename, path],
              stdout=PIPE) # read from path
    with open(path, 'wb') as wpipe:
        kmer_proc = Popen(["generate_kmers", str(kmer)],
                          stdout=wpipe) # write to path
    output = p.communicate()[0]
    kmer_proc.wait()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 的 Popen 替换 Bash 风格的进程 的相关文章

  • 如何获取 Pandas df.merge() 不匹配的列名称

    给出以下数据 data df pd DataFrame Reference A A A B C C D E Value1 U U U V W W X Y Value2 u u u v w w x y index 1 2 3 4 5 6 7
  • 如何将 typeshed 与 mypy 一起使用?

    我克隆了typeshed https github com python typeshed但我不知道如何告诉 mypy 使用它包含的类型提示 我在 mypy help 中没有看到任何选项 mypy 存储库确实包含对 typeshed 存储库
  • Python:访问另一个类中一个类的属性和方法

    假设我有两个 A 类和 B 类 Class A A s attributes and methods here Class B B s attributes and methods here 现在我可以评估 B 类对象中 A 的属性 如下所
  • 使用 cx_oracle 返回 MERGE 中受影响的行数

    如何在 CX Oracle 中执行 MERGE INTO sql 命令来获取受影响的行数 当我在cx oracle 上执行MERGE SQL 时 我得到的cursor rowcount 为 1 有没有办法获取受合并影响的行数 由于 cx o
  • 使用 Python 访问内存映射文件

    我希望利用激战 2 中的内存映射文件 该文件旨在链接到 Mumble 以获得位置音频 该文件包含有关字符坐标的信息和其他有用的信息 我已经能够使用此脚本访问坐标信息 import mmap import struct last while
  • 如果每个元组中的第二项重复,如何从元组列表中删除元素?

    如果每个元组中的第二项重复 如何从元组列表中删除元素 例如 我有一个按第一个元素排序的列表 如下所示 alist 0 7897897 this is a foo bar sentence 0 653234 this is a foo bar
  • 如何在 dash/plotly 中使用 iframe? (Python/HTML)

    我正在创建一个仪表板 我想使用这个交互式地图 网站链接 https www ons gov uk peoplepopulationandcommunity healthandsocialcare causesofdeath articles
  • 将 postgres 连接到 django 时遇到问题

    以下文档来自Django Postgres 文档 https docs djangoproject com en 4 1 ref databases postgresql notes我添加到我的settings py 在我设置的设置中 DA
  • 如何向 Jupyter (ipython) 笔记本自动添加扩展?

    我已经安装了扩展 calico document tools 我可以使用以下命令从 Jupyter 笔记本中加载它 javascript IPython load extensions calico document tools 如何为每个
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • Python父类访问子私有变量

    以下代码会生成错误 class A object def say something self print self foo print self bar class B A def init self self foo hello sel
  • 识别文本中的多个类别和相关情感

    如果您有一个文本语料库 如何识别所有类别 来自预定义类别列表 以及与之相关的情绪 正面 负面写作 我将在 Python 中执行此操作 但现阶段我不一定要寻找特定于语言的解决方案 让我们用一个例子来看看这个问题 试图澄清我的问题 如果我有一整
  • python请求ssl握手失败

    每次我尝试这样做 requests get https url 我收到这条消息 import requests gt gt gt requests get https reviews gethuman com companies Trace
  • 如何忽略 Sentry 捕获中的某些 Python 错误

    我已将 Sentry 配置为捕获 Django Celery 应用程序中的所有错误 它工作正常 但我发现一个令人讨厌的用例是当我必须重新启动我的 Celery 工作人员 PostgreSQL 数据库或消息服务器时 这会导致数千种各种 无法访
  • 如何使用 opencv python 根据检测到的物体的位置生成其热图

    我需要根据对象的位置生成其热图 示例 视频帧中检测到的绿色球 如果它长时间停留在某个位置 那么该位置应该是红色的 并且球在短时间内经过的帧中的位置必须是蓝色的 这样我就需要生成热图 提前致谢 那么你在这里可以做的是 1 首先定义一个热图作为
  • 如何让 Python 生成器返回 None 而不是 StopIteration?

    我使用生成器在列表中执行搜索 如下简单示例 gt gt gt a 1 2 3 4 gt gt gt i for i v in enumerate a if v 4 next 3 只是为了稍微说明一下示例 与上面的列表相比 我使用的列表要长得
  • 用于监视文件夹和更新数据库的 Python 守护进程

    这专门用于管理 MP3 文件 但它应该可以轻松地适用于任何包含大量文件的目录结构 我想找到或编写一个守护程序 最好用Python 来监视一个包含许多子文件夹的文件夹 这些子文件夹都应该包含X个MP3文件 每当添加 更新或删除文件时 它都应该
  • 导入错误:无法导入名称

    我有一个名为 google translate python 的库 https github com terryyin google translate python https github com terryyin google tra
  • print() 函数的有趣/奇怪的机制

    我正在学习Python 我目前正在学习如何定义自己的函数 并且在尝试理解返回值和打印它之间的区别时遇到了一些困难 我读到的关于这个主题的描述对我来说不太清楚 所以我开始自己尝试 我想我现在已经明白了 如果我没记错的话 区别在于你可以传递 a
  • 定义Python类时,如何在其中设置随机变量?

    假设我有一个名为Person 其中只有该人的姓名和性别 性别应从男性和女性中随机选择 为此 我导入random randint 功能 根据随机int确定随机性别 import random class Person alias random

随机推荐

  • E/Surface: getSlotFromBufferLocked:未知缓冲区:0xab7519c0

    我的应用程序有问题 没有在mysql中插入数据 应用程序没有错误 橙色单消息日志是 E Surface getSlotFromBufferLocked unknown buffer 0xab7519c0 我希望你可以帮助我 谢谢 这是 An
  • 如何从客户端的 javax.ws.rs 实体获取纯 XML

    我有一个REST客户端创建一个XML实体通过Entity entity myObject MediaType APPLICATION XML TYPE 之后我打电话webTarget request buildPost 如何获取请求正文XM
  • 检索给定用户发表评论的所有帖子,Ruby on Rails

    我有用户 帖子和评论 用户只能对每个帖子发表一条评论 class User lt ActiveRecord Base has many posts has many comments end class Post lt ActiveReco
  • 如何修复“无法读取 null 的属性‘addEventListener’”错误[重复]

    这个问题在这里已经有答案了 我正在从 Mozilla 开发者网络 MDN 学习 javascript 我在猜数字游戏中遇到错误 该错误在第 46 行显示 Uncaught TypeError Cannot read property add
  • Android:单元测试

    需要一些建议 我有一个应用程序 我需要写一些单元测试 但我真的不知道要测试什么 我已经测试了设置和所有首选项 这很简单 人们通常还会测试什么 假设我有 3 项活动 主要的一个是列表活动 当您单击列表项时 它会将您转发到第二个列表活动 并且在
  • EF Core 2.1 内存数据库不更新记录

    我正在使用内存数据库提供程序进行集成测试 但是我似乎无法更新记录 我已经针对真实的 SQL 数据库运行了相同的代码 并且一切都得到了很好的更新 这是我的测试装置代码 测试夹具 public class TestFixture
  • 动态添加字段到 Razor 表单

    我有一个 Razor 表单 其中包含我想要动态添加项目的项目列表 表格 您可以从下拉列表中选择项目 单击 添加 下拉列表中的项目将添加到列表中 然后我希望所有这些都通过POST当我提交我的表格和我的控制器时HttpPost方法可以处理输入
  • Android Studio 2.2.2:Mac OS X 中缺少工具 > Android 菜单

    标题 差不多了 通常 工具 菜单中有一个 Android 项 其中包含Android SDK Manager之类的东西 由于整个 工具 菜单未显示 因此我无法访问 SDK 管理器 什么控制该子菜单是否显示 我怎样才能解决这个问题 这发生在我
  • 拆分 MS Access 数据库并将后端存储在 Sharepoint 中?

    我有一个包含大量 VBA 代码的 MS Access 数据库 如果我创建 Access Web App 我将失去代码提供的功能 有没有什么方法可以将我的数据库表存储在 SharePoint 中 而不是列表中 并将它们链接到前端以保留在每个用
  • 如何在Python中将HDF5文件直接上传到S3存储桶

    我想将使用 h5py 创建的 HDF5 文件上传到 S3 存储桶 而不使用 boto3 本地保存 This solution https stackoverflow com questions 48491839 any way to wri
  • 如何在azure devops模板任务中参数化azureSubscription

    我正在尝试使用 Azure Devops 模板中的参数 我可以打印模板内的任何参数 但是 当我在模板中使用参数来处理任何需要天蓝色订阅的任务时 管道总是会失败 管道无效 作业 myDeployment 步骤输入 azureSubscript
  • Try-catch-finally,然后再次尝试 catch

    我经常遇到这样的情况 try stmts catch Exception ex stmts finally connection close throws an exception 最后仍然需要一个 try catch 块 克服这个问题的最
  • 在 Atom 中使用氢时出现巨大的 IPKernelApp 错误

    从几天前开始 在几个月没有出现问题之后 我在 Atom 中编辑代码时开始不断弹出一个巨大的错误框 我相信它来自 Hydrogen 插件 奇怪的是即使出现此错误 代码仍然运行并执行我想要的操作 我创建了一个新的 conda 环境 仅安装我需要
  • TensorFlow:从 RNN 获取所有状态

    你如何获得所有隐藏状态tf nn rnn or tf nn dynamic rnn 在 TensorFlow 中 API 只给我最终状态 第一种选择是在构建直接在 RNNCell 上运行的模型时编写一个循环 然而 时间步数对我来说不是固定的
  • 尝试使用 Google 游戏服务登录时出错

    我正在尝试将谷歌游戏服务集成到我的应用程序中 但当我尝试使用测试帐户登录时出现错误 我已遵循他们的所有指示https developers google com games services training signin https de
  • 自动滚动 PyQT QTextWidget

    我怎么能够自动滚屏到我的底部QTextEdit 在我的 GUI 初始化函数中 self mytext QTextEdit self cursor QTextCursor self mytext document self mytext se
  • 如何为 Google 地图信息窗口设置特定高度?

    我知道最大宽度可以用 maxWidth 设置 我想知道为什么没有 maxHeight 选项 这是您要找的吗 如何设置谷歌地图标记信息窗口最大高度 https stackoverflow com questions 919659 how to
  • Python tqdm import检查jupyter笔记本或实验室是否正在运行

    我有一个模块 tqdm 我需要根据是否运行我的模块以不同的方式导入它 ipynb在 jupyter 笔记本或 jupyter 实验室环境中 有没有办法可以在 python 中确定这一点 例如 if
  • 使用单表继承更改 Rails 中 ActiveRecord 类的类型

    我有两种类型的课程 BaseUser lt ActiveRecord Base and User lt BaseUser 它使用 Authlogic 的身份验证系统来 acts as authentic 这种继承是使用单表继承来实现的 如果
  • 使用 Python 的 Popen 替换 Bash 风格的进程

    在 Bash 中 您可以轻松地将进程的输出重定向到临时文件描述符 并且所有这些都由 bash 自动处理 如下所示 mydaemon config file lt echo autostart True n daemonize True 或者