Bash 进程替换在 Python 中与 subprocess.run() 和共享输入



我有一个关于使用子进程在python中替换bash进程的问题。我试图以一种主函数和子进程都使用来自 stdin 的相同输入(代码中是一个字符串变量(的方式编写它。这是代码:

p1 = subprocess.run(['cat'],
stdout=subprocess.PIPE, input=in_fa.encode())
p2 = subprocess.run(['bwa samse reference/C57BL_6J.fa <(bwa aln -l 20 reference/C57BL_6J.fa -) -'],
shell=True, executable="/bin/bash", input=p1.stdout,
stdout=subprocess.PIPE)

在此示例中,in_fa是如下所示的字符串:

>headerntTCAGCCTTCCCTTCCATTTCTCTCCCCTTCCCTCTCCTCCCCATTTCAGAGTTTCTTTAGAATCTGTATTCTGGCACCCAAAGTGAACTATGTGTCTGACTCAGGGGCTCTTTGTTTCACTGCAGGGCTGTGGTG

在此代码中,主进程和子进程中的"-"都引用in_fa,但是当主进程正确读取它时,子进程却没有。

例如,这将起作用,但它不是动态的,它从文件而不是变量中读取:

p1 = subprocess.run(['''cat fasta/input.fasta |
bwa samse reference/C57BL_6J.fa <(
cat fasta/input.fasta |
bwa aln -l 20 reference/C57BL_6J.fa -) -'],
shell=True, executable="/bin/bash", stdout=subprocess.PIPE)

任何帮助将不胜感激!同时,我会继续努力。

不能使用来自两个不同进程的标准输入;它们需要分别接收一个副本。

我的方法是将字符串写入临时文件并从那里获取它。

此外,您的subprocess呼叫有几个问题。

  • 您需要传入字符串或令牌列表。 你所拥有的看起来它正在工作,但它实际上没有明确的定义。

  • cat在这里没有用处;cat的目的是合并多个文件,而您只有一个文件。(它在外壳中也没有用。

import tempfile
import os
with tempfile.TemporaryDirectory() as tmpdirname:
fa_tmp = os.path.join([tmpdirname, 'in.fa'])
with open(fa_tmp, 'wb') as handle:
handle.write(in_fa.encode())
proc = subprocess.run(
'''bwa samse reference/C57BL_6J.fa <(
bwa aln -l 20 reference/C57BL_6J.fa {0})
{0}'''.format(fa_tmp),
shell=True, executable="/bin/bash", 
check=True, stdout=subprocess.PIPE)

另请参阅在 Python 中运行 Bash 命令,我有一个答案,其中更详细地概述了您遇到的一些问题。

最新更新