gpt4 book ai didi

Python 从动态文件名导入

转载 作者:行者123 更新时间:2023-12-01 09:04:14 24 4
gpt4 key购买 nike

我处于以下情况:我有一个 python 脚本 main.py,它根据配置文件运行一些操作。配置文件本身就是一个 python 脚本/类。我希望能够从命令行传递不同的配置文件作为参数并将其导入主脚本中。

Python 是否可以动态加载类?如果是这样,我怎样才能完成这项任务?

请参阅以下最小示例以进行说明。

这是我的脚本main.py:

import argparse

def get_arguments():
parser = argparse.ArgumentParser(description="foo")
parser.add_argument("--configfile", required=True)
return parser.parse_args()

def main():
args = get_arguments()

from args.configfile import MyConfig # <-- how is that possible?

if MyConfig.SETTING1:
do_something()

if __name__ == '__main__':
main()

这是一个示例config.py:

class MyConfig(BaseConfig):
SETTING1 = True
SETTING2 = 1

这是另一个示例config-special.py:

class MyConfig(BaseConfig):
SETTING1 = False
SETTING2 = 42

我这样调用它:

$ python3 main.py --configfile config.py
$ python3 main.py --configfile config-special.py

最佳答案

使用import_module动态导入模块,详细解释见代码。

仍然使用你的下一个命令来调用它们。

$ python3 main.py --configfile config.py
$ python3 main.py --configfile config-special.py

ma​​in.py

import argparse
# import sys
from importlib import import_module

def get_arguments():
parser = argparse.ArgumentParser(description="foo")
parser.add_argument("--configfile", required=True)
return parser.parse_args()

def main():
args = get_arguments()
module_name = args.configfile[:-3] # here, the result is the file name, e.g. config or config-special

# Not use __import__, use import_module instead according to @bruno desthuilliers's suggestion
# __import__(module_name) # here, dynamic load the config module
# MyConfig = sys.modules[module_name].MyConfig # here, get the MyConfig class
MyConfig = import_module(module_name).MyConfig

# from args.configfile import MyConfig # <-- how is that possible?

if MyConfig.SETTING1:
#do_something()
print("do_something")

if __name__ == '__main__':
main()

关于Python 从动态文件名导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52200141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com