Python:根据用户想要的文件导入文件。

26 浏览
0 Comments

Python:根据用户想要的文件导入文件。

这个问题已经在这里有答案

如何使用importlib.import_module在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日
0
0 Comments

如果你想要一个“插件”发现工具的另一种解决方案:

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'。你不必初始化你的插件,但仍然可以在运行时随时运行此函数以加载你的插件。

0
0 Comments

好的,你的问题是一个路径相关的问题。你期望脚本在load.py所在的目录中运行,但实际情况并非如此。

你需要做的是像下面这样:

import imp, os, plugins
path = os.path.dirname(plugins.__file__)
imp.load_source('TestPlugin', os.path.join(path, 'test_plugin.py')

其中plugins是包含所有插件的模块(即仅为空__init__.py),它将帮助你获得插件模块文件的完整路径。

0