python subprocess命令行解析错误

时间:2014-04-24 16:13:33

标签: python subprocess wait popen

我正在运行一个python程序,我用子进程WolfPsort程序编写。 它是蛋白质定位检测程序的生物信息学工具。 但是,python子进程不会执行我的输入文件。 这是代码

#!/usr/bin/python
# secref.py is for secretome refining

import os
import sys
import subprocess

if len(sys.argv) != 2:
        print >> sys.stderr, 'Usage: python secref.py [*.fasta]'
        exit(1)

if sys.argv[1].endswith('.fasta'):
        filename = sys.argv[1]
else:
        print >> sys.stderr, 'Input correct file... [*.fasta]'
        exit(1)

filehandle = open(filename,'r')

progWolf = subprocess.Popen(['runWolfPsortSummary','fungi','<',filename,'>','tmpWolfResult'])
progWolf.wait()

如果我运行代码,它会给出如下错误消息:

[karyo@hostname secref.1.0]$ python secref.py A.carbonarius.fasta 

Command Line Parsing Error; Do not know what to do with argument "<"

Usage:
    runWolfPsortSummary [*OPTIONS*] *organismType*

    runWolfPsortSummary (--usage|--help|--man)

    Pipe sequences in from standard in.

子过程剂量无法识别“&lt;”符号,但WolfPort程序需要“&lt;”识别输入的fasta文件和“&gt;”需要写一个临时结果文件。

如何让子流程理解参数“&lt;”?

请帮帮我!

3 个答案:

答案 0 :(得分:2)

我猜你是否正在尝试使用shell魔法来读取文件名并写入tmpWolfResult。为了实现这一目标,您需要:

progWolf = subprocess.Popen('runWolfPsortSummary fungi < %s > tmpWolfResult'%filename, shell=True)

我觉得有必要提一下,因为这个输入来自命令行参数,它在技术上不是安全/可信,并且有权在您的系统上运行此脚本的恶意用户可以做一些讨厌的事情。

但是,您可能更有可能分发此脚本(或者只是自己使用它),而您和您的用户可能并不想搞乱您自己的系统......

答案 1 :(得分:1)

<>通常由shell解释,Popen()默认情况下不会不必要地生成。您可以使用stdinstdout参数来重定向文件的输入/输出:

from subprocess import check_call

with open(filename) as file, open('tmpWolfResult', 'w') as output_file:
    check_call(['runWolfPsortSummary', 'fungi'], stdin=file, stdout=output_file)

注意:check_call()如果runWolfPsortSummary以非零状态退出,则会引发异常。

答案 2 :(得分:0)

Popen函数采用以逗号分隔的参数列表。你写它的方式,

'<'
filename
'>'

作为三个单独的参数发送。我假设您想将其连接成一个参数。

progWolf = subprocess.Popen(['runWolfPsortSummary','fungi','<' + filename + '>','tmpWolfResult'])