Python:根据用户想要的文件导入文件。
Python:根据用户想要的文件导入文件。
这个问题已经在这里有答案:
我有以下目录结构:
+ code | --+ plugins | -- __init__.py -- test_plugin.py (has a class TestPlugin) -- another_test_plugin.py (has a class AnotherTestPlugin) --+ load.py --+ __init__.py
在load.py中,我想要能够只初始化用户指定的那些类。例如,假设我做了这样的事情:
$ python load.py -c test_plugin # Should only import test_plugin.py and initialize an object of the TestPlugin class
我试图使用\"imp\"模块来完成这个,但是它一直显示\"没有该文件或目录\"。我的理解是它无法正确理解路径。有人可以帮助我吗?
admin 更改状态以发布 2023年5月25日
如果你想要一个“插件”发现工具的另一种解决方案:
import imp, os import glob def load_plugins(path): """ Assuming `path` is the only directory in which you store your plugins, and assuming each name follows the syntax: plugin_file.py -> PluginFile Please note that we don't import files starting with an underscore. """ plugins = {} plugin_files = glob.glob(path + os.sep + r'[!_]*.py') for plugin_path in plugin_files: module_name, ext = os.path.splitext(plugin_path) module_name = os.path.basename(module_name) class_name = module_name.title().replace('_', '') loaded_module = imp.load_source(class_name, plugin_path) # we import the plugin plugins[module_name] = getattr(loaded_module, class_name) return plugins plugins = load_plugins(your_path_here) plugin_name = sys.argv[3] plugin = plugins.get(plugin_name) if not plugin: # manage a not existing plugin else: plugin_instance = plugin() # creates an instance of your plugin
这样,你也可以通过更改键来指定不同的名称,例如 'test_plugins' => 'tp'。你不必初始化你的插件,但仍然可以在运行时随时运行此函数以加载你的插件。