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

子流程中有多个管道

姬博瀚
2023-03-14
问题内容

我正在尝试使用Ruffus管道中的多个Sailq文件作为参数的Sailfish。我使用python<()中的子流程模块执行Sailfish,但即使设置,在子流程调用中也不起作用shell=True

这是我要使用python执行的命令:

sailfish quant [options] -1 <(cat sample1a.fastq sample1b.fastq) -2 <(cat sample2a.fastq sample2b.fastq) -o [output_file]

或(最好):

sailfish quant [options] -1 <(gunzip sample1a.fastq.gz sample1b.fastq.gz) -2 <(gunzip sample2a.fastq.gz sample2b.fastq.gz) -o [output_file]

概括:

someprogram <(someprocess) <(someprocess)

我将如何在python中执行此操作?子过程正确吗?


问题答案:

模拟bash进程替换:

#!/usr/bin/env python
from subprocess import check_call

check_call('someprogram <(someprocess) <(anotherprocess)',
           shell=True, executable='/bin/bash')

在Python中,您可以使用命名管道:

#!/usr/bin/env python
from subprocess import Popen

with named_pipes(n=2) as paths:
    someprogram = Popen(['someprogram'] + paths)
    processes = []
    for path, command in zip(paths, ['someprocess', 'anotherprocess']):
        with open(path, 'wb', 0) as pipe:
            processes.append(Popen(command, stdout=pipe, close_fds=True))
    for p in [someprogram] + processes:
        p.wait()

在哪里named_pipes(n)

import os
import shutil
import tempfile
from contextlib import contextmanager

@contextmanager
def named_pipes(n=1):
    dirname = tempfile.mkdtemp()
    try:
        paths = [os.path.join(dirname, 'named_pipe' + str(i)) for i in range(n)]
        for path in paths:
            os.mkfifo(path)
        yield paths
    finally:
        shutil.rmtree(dirname)

实现bash进程替换的另一种更可取的方式(无需在磁盘上创建命名条目)是使用@Dunes建议的/dev/fd/N文件名(如果可用)。在FreeBSD上,()为进程打开的所有文件描述符创建条目。要测试可用性,请运行:
fdescfs(5)/dev/fd/#

$ test -r /dev/fd/3 3</dev/null && echo /dev/fd is available

如果失败;尝试进行符号链接/dev/fdproc(5)就像在某些Linux上所做的那样:

$ ln -s /proc/self/fd /dev/fd

这是/dev/fd基于someprogram <(someprocess) <(anotherprocess)bash命令的实现:

#!/usr/bin/env python3
from contextlib import ExitStack
from subprocess import CalledProcessError, Popen, PIPE

def kill(process):
    if process.poll() is None: # still running
        process.kill()

with ExitStack() as stack: # for proper cleanup
    processes = []
    for command in [['someprocess'], ['anotherprocess']]:  # start child processes
        processes.append(stack.enter_context(Popen(command, stdout=PIPE)))
        stack.callback(kill, processes[-1]) # kill on someprogram exit

    fds = [p.stdout.fileno() for p in processes]
    someprogram = stack.enter_context(
        Popen(['someprogram'] + ['/dev/fd/%d' % fd for fd in fds], pass_fds=fds))
    for p in processes: # close pipes in the parent
        p.stdout.close()
# exit stack: wait for processes
if someprogram.returncode != 0: # errors shouldn't go unnoticed
   raise CalledProcessError(someprogram.returncode, someprogram.args)

注意:在我的Ubuntu机器上,该subprocess代码仅在Python 3.4+中有效,尽管pass_fds自Python 3.2起可用。



 类似资料:
  • 问题内容: 我该如何使用子流程模块运行bash脚本,必须为此提供几个参数? 这是我目前正在使用的: bash脚本似乎没有接受任何参数。非常感谢您提供任何见解! 问题答案: 将参数作为列表传递,请参阅docs中的第一个代码示例: 如果不是字符串;在传递到:之前将其转换为字符串。

  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 问题内容: 我的工作应该使用并行技术,并且我是python的新用户。因此,我想知道您是否可以共享有关python和模块的一些资料。两者有什么区别? 问题答案: 该模块使您可以运行和控制其他程序。您可以使用计算机上的命令行启动的任何内容,都可以使用此模块运行和控制。使用它可以将外部程序集成到您的Python代码中。 该模块可让您将以python编写的任务划分为多个进程,以帮助提高性能。它提供与该模块

  • 我想运行node。js作为子流程,并向其提供输入。使用C,下面是我的一些示例代码。 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上。 子流程似乎只是缓冲-为什么?我希望最终将子流程std

  • Process 结构体代表了一个正在运行的子进程,并公开了stdin(标准输入),stdout(标准输出) 和 stderr(标准错误) 句柄,通过管道和底层的进程交互。(原文:The Process struct represents a running child process, and exposes the stdin, stdout and stderr handles for int

  • bg211本,985硕,经管金融专业 一面、二面(都像专业面……): ★自我介绍:专业出身(商业、逻辑、数据分析基础)+实习经验(不对口,但相关的:品牌推广、文创公司)+求职意向(平时就很关注互联网、电商领域,多多是其中使用最多的网购平台) ★对互联网、电商的理解,尽量详细:多关注多多竞品,历史,战略,业务重点(我说了多多以低价策略与社群裂变起家,19年百亿补贴提质增效,目前在转海外电商temu)