通过echo pip将python变量(字符串)传递给bash命令

2024-10-01 22:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在命令行(bash)上将python(python变量)中的字符串作为输入传递给序列对齐程序(muscle)时遇到了问题。muscle可以从命令行获取stdin,例如

~# echo -e ">1\nATTTCTCT\n>2\nATTTCTCC" | muscle

MUSCLE v3.8.31 by Robert C. Edgar

http://www.drive5.com/muscle
This software is donated to the public domain.
Please cite: Edgar, R.C. Nucleic Acids Res 32(5), 1792-97.

- 2 seqs, max length 8, avg  length 8
00:00:00     22 MB(2%)  Iter   1  100.00%  K-mer dist pass 1
00:00:00     22 MB(2%)  Iter   1  100.00%  K-mer dist pass 2
00:00:00     23 MB(2%)  Iter   1  100.00%  Align node       
00:00:00     23 MB(2%)  Iter   1  100.00%  Root alignment
>1
ATTTCTCT
>2
ATTTCTCC

我所追求的就是这个fasta对齐(最后4行)——你可以重定向肌肉的输出(echo -e ">1\nATTTCTCT\n>2\nATTTCTCC" | muscle > out.file)来获得fasta对齐,我需要它来进行下游处理。但是为了达到这个目的,我必须传递'muscle'FASTA序列字符串,我认为最好通过上面bash中的echo来完成。在

因此,该脚本使用两个multiFASTA文件,并根据每个文件的id列表对每个FASTA序列进行配对-这是可行的(尽管我意识到这可能不是最有效的方法-我是新的python用户)。然后我需要在计算距离/差之前对齐muscle中的每个集合。在

以下是我目前所掌握的情况:

^{pr2}$

“temp_align”变量是我想传递给muscle的-它是从每个multiFASTA文件中组合适当的fasta序列的结果,对于ids/列表上的每个循环,它的格式类似于fasta文件。在

这个问题是我可以echoFASTA字符串,但我似乎不能通过stdin将其“管道”到肌肉。。。我得到的主要错误是:AttributeError: 'str' object has no attribute 'stdout'。在

~#python Beta3.py 
>1
ATCGACTACT
>2
ATCGCGCTACT

Traceback (most recent call last):
  File "Beta3.py", line 38, in <module>
    subprocess.call(['bash','muscle'], stdin=first.stdout)
AttributeError: 'str' object has no attribute 'stdout'

子进程或其他命令行模块是否可以将字符串作为标准输入?如果不是的话,我不知道我怎样才能回音然后进入肌肉。。。 任何其他的想法都将不胜感激。我从这个线程中尝试了几个选项unix.stackexchange

但还没有运气。在

编辑:以下是一些示例文件:

~# cat test1.fasta 
>1
ATCGACTACT
>2
ACTCAGTCA
>3
TTCACAGGG
~# cat test2.fasta 
>1
ATCGCGCTACT
>2
GGCGTCAGTCA
>3
TTCAACCCCAGGG
~# cat test1.list 
1
2
3
~# cat test2.list 
1
3
2

编辑2:前一篇文章是相关的,但我的问题是链接两个bash命令,以python变量(字符串)开头……然后,理想情况下,将第二个命令的stdout捕捉回python变量中。。。我不太明白如何把那篇文章的答案转化为我具体问题的答案……我想我不完全理解海报的意图。在


Tags: 文件字符串命令行echobashstdinstdout序列
1条回答
网友
1楼 · 发布于 2024-10-01 22:33:50

似乎您想与muscle进程通信,那么您需要一个管道,使用这个

(out, err) = subprocess.Popen(['muscle'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate(temp_align)
print out

相关问题 更多 >

    热门问题