我是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
有人能指出我做错了什么。
答案 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: