我有以下脚本 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可能有用或如何在这种情况下使用的示例。非常感谢你!!
答案 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)