当前位置: 首页 > 知识库问答 >
问题:

Python:根据用户想要的文件导入文件[重复]

胥承
2023-03-14

我有以下目录结构

+ code
|
--+ plugins
  |
  -- __init__.py
  -- test_plugin.py (has a class TestPlugin)
  -- another_test_plugin.py (has a class AnotherTestPlugin)
--+ load.py
--+ __init__.py

满载。py,我希望能够仅初始化用户指定的那些类。例如,假设我做了如下事情

$ python load.py -c test_plugin # Should only import test_plugin.py and initialize an object of the TestPlugin class

我在尝试使用“imp”模块时遇到问题。它不断地说“没有这样的文件或目录”。我的理解是,它不知何故没有正确理解路径。有人能帮我解决这个问题吗?

共有3个答案

林威
2023-03-14
exec('import ' + sys.argv[2])
obj = test_plugin.TestPlugin()

这里sys.argv[2]是来自命令行参数的test_plugin字符串。

编辑:避免使用exec的另一种方法:

import importlib
mod = importlib.import_module(sys.argv[2])
吴浩博
2023-03-14

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

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”=

卓学智
2023-03-14

你要做的事情是:

import imp, os, plugins

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

插件是包含所有插件的模块(即空的__init__. py),这将帮助您获得插件模块文件的完整路径。

 类似资料:
  • 问题内容: 我正在导入许多不同的脚本,因此在文件的顶部,它会被导入语句弄得乱七八糟,即: 有没有办法将所有这些都移动到其他地方,然后我要做的就是导入该文件,所以它只是一个干净的导入? 问题答案: 当然有;只需在主文件所在的目录中创建一个名为的文件,然后将导入文件放置在该目录中即可。然后,您可以简单地在主脚本中使用。

  • 这个问题是本文的后续内容:Python-根据子文件夹和文件名重命名子文件夹中的文件。 我正在尝试遍历中子文件夹中的文件,并以指定的方式重命名每个文件。以下是我目前掌握的代码: 当我运行该行时,,它正确地显示保存在中的名为的文件将被重命名为。 但是,os.rename命令返回以下错误: "必须是字符串,而不是列表。" 这似乎是由于我在os.rename命令中使用了“文件名”。据我所知,os.rena

  • 问题内容: 我有以下文件夹结构。 我想从位于另一个Python文件中的导入一些功能 我试过了 和其他一些尝试,但到目前为止,我无法正确导入。我怎样才能做到这一点? 问题答案: 默认情况下,你不能这样做。导入文件时,Python仅搜索当前目录,入口点脚本运行所在的目录,并且包括诸如软件包安装目录之类的位置(实际上比这稍微复杂一点,但这涵盖了大多数情况) 。 但是,你可以在运行时添加到Python路径

  • 问题内容: 我想让我的两个python文件互相导入一些方法。这似乎给了我导入错误。 例: file_A.py: file_B.py: 我之所以这样做,是因为我想以一种对我来说直观的方式来组织项目,而不是按照对编译器有意义的方式来组织项目。 有没有办法做到这一点? 谢谢! 问题答案: 不要在其他模块中直接使用名称。 file_A.py file_B.py

  • 同一位置有2个csv文件:1-candidates.csv,2-store.csv 当我在使用以下代码时导入candidates.csv filw时,它被导入: pandas._libs.parsers.textreader._convert_with_dtype()中的pandas_libs\parsers.pyx pandas._libs.parsers.textreader._string_

  • 关于链接的图稿与嵌入的图稿 当置入图形时,您将在布局中看到文件的屏幕分辨率版本,从而可以查看和定位文件,但实际的图形文件可能已链接或已嵌入。 链接的图稿虽然连接到文档,但仍与文档保持独立,因而得到的文档较小。您可以使用变换工具和效果来修改链接的图稿;但是,不能在图稿中选择和编辑单个组件。可以多次使用链接的图形,而不会显著增加文档的大小;也可以一次更新所有链接。当导出或打印时,将检索原始图形,并按照