如何将optparse选项与python中的变量名称集成

时间:2014-11-08 02:36:11

标签: python optparse

我是python和optparse模块的新手。我已经想出了如何使用optparse在python脚本中添加选项,但是在python中将选项与我的变量名称链接起来有困难。

import sys
from optparse import OptionParser

def main ():
    parser = OptionParser()
    parser.add_option("-f", "--file", dest="in_filename",
                      help="Input fasta file", metavar="FILE")
    parser.add_option("-o", "--out", dest="out_filename",
                      help="Output fasta file", metavar="FILE")
    parser.add_option("-i", "--id", dest="id",
                      help="Id name to change", metavar="ID")
    (options,args) = parser.parse_args()

    with open(f, 'r') as fh_in:
        with open(o, 'w') as fh_out:
            id = i
            result = {}
            count = 1
            for line in fh_in:
                line = line.strip()
                if line.startswith(">"):
                    line = line[1:]
                    result[line] = id + str(count)
                    count = count + 1
                    header = ">" + str(result[line])
                    fh_out.write(header)
                    fh_out.write("\n")
                else:
                    fh_out.write(line)
                    fh_out.write("\n")

main()

当我运行这个时,我得到以下追溯和错误:

python header_change.py -f consensus_seq.txt -o consensus_seq_out.fa -i "my_test"
Traceback (most recent call last):
  File "/Users/upendrakumardevisetty/Documents/git_repos/scripts/header_change.py", line 36, in <module>
    main()
  File "/Users/upendrakumardevisetty/Documents/git_repos/scripts/header_change.py", line 18, in main
    with open(f, 'r') as fh_in:
NameError: global name 'f' is not defined

有人能指出我做错了什么。

1 个答案:

答案 0 :(得分:5)

你在这里遇到两个问题。


首先,正如the optparse tutorial所示,optparse没有创建全局变量,它会在它返回的options命名空间中创建属性:

  

parse_args()返回两个值:

     
      
  • options,一个包含所有选项值的对象 - 例如。如果--file采用单个字符串参数,则options.file将是用户提供的文件名,如果用户未提供该选项,则为None
  •   
  • args,解析选项后剩余的位置参数列表
  •   

因此,如果用户输入-f,您将不会拥有f,那么您将拥有options.f


其次,f无论如何都不是正确的名称。您明确指定了不同的目标,而不是默认目标:

parser.add_option("-f", "--file", dest="in_filename",
                  help="Input fasta file", metavar="FILE")

因此,它会按照您的要求执行操作并将文件存储在in_filename中。


同样适用于其他选择。所以,你的代码应该这样开始:

with open(options.in_filename, 'r') as fh_in:
    with open(options.out_filename, 'w') as fh_out: