运行splitter_freq.py触发sys.argv索引越界IndexError报错
问题原因
sys.argv的索引从0开始计数,索引0固定是脚本自身的文件名,后续传入的命令行参数从索引1开始排列。你执行的命令是python3.6 splitter_freq.py abc.dat,实际sys.argv只有2个元素:['splitter_freq.py', 'abc.dat'],有效索引最大值为1。- 代码中初始化
position = 1后,直接执行name = str(sys.argv[position+1]),也就是要读取索引为2的元素,该位置不存在任何值,直接触发IndexError: list index out of range报错。 - 从后续路径拼接逻辑看,原脚本设计的调用格式为
python3.6 splitter_freq.py <输出目录名> <待处理dat文件路径1> [待处理dat文件路径2 ...],第一个传入的参数是拆分后文件的存放目录名,从第二个参数开始才是要处理的dat文件。你当前执行命令仅传入了1个参数,既不满足脚本的参数要求,也直接触发了索引越界。
可行解决方案
根据你的使用需求二选一即可:
方案1:保留原脚本设计,指定输出目录
执行命令时补上输出目录参数即可,例如你要把拆分后的文件存到名为split_result的文件夹下,处理abc.dat文件,执行命令改为:
python3.6 splitter_freq.py split_result abc.dat
注意:执行命令前需要手动创建split_result文件夹,否则会触发路径不存在的报错。如果想让脚本自动创建目录,可以在代码开头导入os模块,在读取name参数后加一行os.makedirs(name, exist_ok=True)即可。
方案2:修改脚本,无需单独传输出目录(直接输出到当前路径)
如果你不需要单独建输出文件夹,想把拆分后的结果直接存在当前工作路径,可以修改脚本开头的参数逻辑,修正后的开头代码如下:
import sys import os # 可选,加了可以自动建目录 arguments = len(sys.argv) - 1 position = 1 name = "." # 直接指定输出目录为当前路径 os.makedirs(name, exist_ok=True) # 可选,确保目录存在 # 修正循环条件,保证第一个传入的dat文件能被正常处理 while (arguments >= position): bench_freq_names = [] path0 = "%s/"%name+sys.argv[position] position = position+1 # 后续原有代码保持不变即可
修改完成后,你原来的执行命令python3.6 splitter_freq.py abc.dat就可以正常运行了。
内容的提问来源于stack exchange,提问作者Yifan
相关产品推荐
相关产品推荐

