我正在尝试使用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/fd
,proc(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)