无法使用stdin在python解释器中连接多个外部脚本

时间:2013-06-15 00:37:20

标签: python subprocess stdout stdin popen

我有以下脚本 perl脚本(fasta.pl)接受一个输入文件(abc)并给出字符串。

 $ ./fasta.pl abc.txt

我第一次尝试

p1= subprocess.Popen(["./pdb_fasta.pl","abc.txt"],stdout=subprocess.PIPE);

然后我确认p1是文件对象

>>> type(p1.stdout)
<type 'file'>

我有另一个脚本,count.py,它将文件作为输入

$ ./count.py p1.stdout

现在当我尝试将p1.stdout用于此脚本时,我收到错误。我尝试了两种不同的方法 第一个

p2= subprocess.Popen(["./count_aa.py",p1.stdout],stdout=subprocess.PIPE).stdout.read()

,错误是

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 1106, in _execute_child
    raise child_exception
TypeError: execv() arg 2 must contain only strings

第二种方法:这里的错误是因为脚本count_aa.py需要一个文件作为参数而stdin没有提供。

>>> p2= subprocess.Popen(["./count_aa.py"],stdin=p1.stdout,stdout=subprocess.PIPE).stdout.read()
Traceback (most recent call last):
  File "./count_aa.py", line 4, in <module>
    fil=open(sys.argv[1],'r').read()
IndexError: list index out of range
>>> 

我正在考虑在这一行上实现所需的结果,我将一个子进程的输出作为输入传递给另一个子进程。但这不像上面解释的那样有效。

p1= subprocess.Popen(["./pdb_fasta.pl","abc.txt"],stdout=subprocess.PIPE)
p2= subprocess.Popen(["./count_aa.py"],stdin=p1.stdout,stdout=subprocess.PIPE).stdout.read()

可以解释一下这里的错误,并给出stdin可能有用或如何在这种情况下使用的示例。非常感谢你!!

1 个答案:

答案 0 :(得分:1)

您的上一个代码等同于以下shell命令。

./pdb_fasta.pl abc.txt | ./count_aa.py

要使您的上一个代码生效,请更改count_aa.py以从stdin获取输入。例如:

import sys

n = 0
for line in sys.stdin:
    n += 1
print(n)