导入Python文件内的函数时为何要求输入原文件的命令行参数
问题原因
Python导入任意模块时,会从头到尾执行该模块内所有顶层代码(也就是无缩进的全局代码),并非仅执行你指定导入的函数。你写的file1.py里,argparse参数解析逻辑、args = parser.parse_args()语句、以及后续的dataA = load_sample(NAME_FILE_1)代码都属于顶层代码,只要导入这个文件就会自动触发执行,自然会要求传入必填的--vcf1、--vcf2参数。
修复方法
把file1.py里仅在直接运行文件时才需要执行的代码,全部放到if __name__ == "__main__":判断块中。这个判断的作用是:只有当你直接用python file1.py运行该文件时,块内代码才会执行;如果是作为模块被其他文件导入,块内代码不会运行。
修改后的file1.py示例:
import os import argparse import pandas as pd import numpy as np def load_sample (Name_file): ''' Take the header of the body of the CSV file ''' with open(Name_file, 'r') as f: for line in f: if line.startswith('#') and len(line)>2 and line[1] != '#': columns = line[1:-1].split('\t') data = pd.read_csv(Name_file, comment='#', delimiter='\t', names=columns) break return data # 只有直接运行本文件时才执行下面的代码 if __name__ == "__main__": # Enter the path/file names parser = argparse.ArgumentParser() parser.add_argument('--vcf1', type=str, required=True) parser.add_argument('--vcf2', type=str, required=True) args = parser.parse_args() NAME_FILE_1 = args.vcf1 NAME_FILE_2 = args.vcf2 # The data of the VCF is here dataA = load_sample(NAME_FILE_1) dataB = load_sample(NAME_FILE_2)
修改完成后再从test1.py导入load_sample函数,就不会触发argparse的参数校验,测试可以正常运行。
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

