如何从含ArgParser的模块导入函数且无需传递命令行参数
无需传参导入执行a.py中func()的解决方案
问题原因
当b.py导入a模块时,a.py里的顶层代码会全部执行,包括args = parser.parse_args()这一行。这行代码会读取运行b.py时的命令行参数,而你没传参,所以触发了argparse的参数缺失报错。
解决方案
方案1:修改a.py(推荐)
把参数解析逻辑放到if __name__ == '__main__':代码块中,这样只有直接运行a.py时才会执行参数解析,导入模块时不会触发。修改后的a.py:
import argparse def func(): print('Hello world!') if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("arg", help="Some argument") args = parser.parse_args() # 这里可以添加直接运行a.py时的业务逻辑
此时运行python3.8 '/home/b.py',会正常输出Hello world!,无需传参。
方案2:修改b.py(无法修改a.py时用)
在导入a模块前,给sys.argv添加一个占位参数,满足a.py的参数要求:
import sys # 添加一个占位参数,避免a.py参数解析报错 sys.argv.append('dummy') from a import func func()
方案3:捕获导入时的异常(不推荐)
通过捕获argparse抛出的SystemExit异常,跳过参数解析的报错,但这种方式可能掩盖其他正常的退出逻辑,仅作为临时 workaround:
import importlib import sys try: # 尝试导入a模块 a_module = importlib.import_module('a') except SystemExit: # 忽略参数解析导致的退出异常 pass # 提取func并执行 a_module.func()
内容的提问来源于stack exchange,提问作者JaSON
相关产品推荐
相关产品推荐

