用于将stdin和stdout重定向到shell脚本的Python代码

时间:2015-11-27 01:55:25

标签: python shell command-line stdout stdin

我正在尝试编写一个从文件读取并使用命令行写入新文件的程序。我正在使用CommandLine类并使用ArgParse接受不同的args以及输入和输出的文件名。我正在尝试将stdin和stdout重定向到这些文件。但是,我一直收到错误,我把它放在下面代码的底部。我是否错误地输入了命令行的参数,还是正在进行其他操作?我的所有文件都在同一个文件夹中。

class CommandLine() :
'''
Handle the command line, usage and help requests.

CommandLine uses argparse, now standard in 2.7 and beyond. 
it implements a standard command line argument parser with various argument options,
a standard usage and help, and an error termination mechanism do-usage_and_die.

attributes:
all arguments received from the commandline using .add_argument will be
avalable within the .args attribute of object instantiated from CommandLine.
For example, if myCommandLine is an object of the class, and requiredbool was
set as an option using add_argument, then myCommandLine.args.requiredbool will
name that option.

'''

def __init__(self, inOpts=None):
    '''
    CommandLine constructor.
    Implements a parser to interpret the command line argv string using argparse.
    '''

    import argparse
    self.parser = argparse.ArgumentParser(description = 'Program prolog - a brief description of what this thing does', 
                                         epilog = 'Program epilog - some other stuff you feel compelled to say', 
                                         add_help = True, #default is True 
                                         prefix_chars = '-', 
                                         usage = '%(prog)s [options] -option1[default] <input >output'
                                         )
    self.parser.add_argument('inFile', action = 'store', help='input file name')
    self.parser.add_argument('outFile', action = 'store', help='output file name')
    self.parser.add_argument('-lG', '--longestGene', action = 'store', nargs='?', const=True, default=False, help='longest Gene in an ORF')
    self.parser.add_argument('-mG', '--minGene', type=int, choices= (0, 100, 200, 300, 500, 1000), action = 'store', help='minimum Gene length')
    self.parser.add_argument('-s', '--start', action = 'append', nargs='?', help='start Codons') #allows multiple list options
    self.parser.add_argument('-st', '--stop', action = 'append', nargs='?', help='stop Codons') #allows multiple list options
    self.parser.add_argument('-v', '--version', action='version', version='%(prog)s 0.1')  
    if inOpts is None :
        self.args = self.parser.parse_args()
    else :
        self.args = self.parser.parse_args(inOpts)

C:\Users\Zach\Documents\UCSC\BME 160\Lab 5>python findORFsCmdLine.py --    minGene=3
00 --longestGene --start=ATG --stop=TAG --stop=TGA --stop=TAA <tass2.fa     >result.
txt
usage: findORFsCmdLine.py [options] -option1[default] <input >output
findORFsCmdLine.py: error: the following arguments are required: inFile,     outFile

1 个答案:

答案 0 :(得分:0)

错误告诉您没有提供inFileoutFile。这似乎令人困惑,因为您确实在命令行上提供了<tass2.fa>result.txt

在命令行<>上有特殊含义。 <tass2.fabash(或您使用的任何一个shell)处理,它会打开文件tass2.fa并通过stdin将内容发送到您的程序。然后它会从命令行参数列表中删除它,因为bash已经处理过它。

>result.txt发生类似的事情,文件中通常转到stdout的任何输出(如打印调用)都会写入该文件。再次bash处理这个,所以你的程序永远不会从命令行获取参数。

要确保文件名转到您的计划,您需要删除<>符号。

除此之外,add_argumentinFile的通话方式outFile也不正确。使用action='store'只是将参数的值存储在给定名称下。这是默认操作,因此这样做是多余的。

您需要告诉add_argument这些是文件类型。然后,您可以将它们用作文件,并根据需要进行读写。

parser.add_argument('inFile', type=argparse.FileType('r'))
parser.add_argument('outFile', type=argparse.FileType('w'))

如果您希望允许这些参数是可选的,并且如果它们不提供文件名则自动使用stdinstdout,那么您可以这样做:

parser.add_argument('inFile', type=argparse.FileType('r'),
    nargs='?', default=sys.stdin)
parser.add_argument('outFile', type=argparse.FileType('w'),
    nargs='?', default=sys.stdout)

您说您正在编写一个程序,该程序从文件读取并使用命令行写入新文件,然后继续说您正在尝试将这些文件重定向到stdin和stdout。

如果您打算使用带有><运算符的shell重定向输入和输出文件,则无需使用{{1}调用add_argument完全没有。只需让shell处理它。从您的程序中删除该行,并使用outFile或类似内容将您的内容发送到print,然后将创建该文件。您仍然需要拨打电话stdout