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

Python从文件动态导入方法

夏何平
2023-03-14

我有多个文件的结构像一个文件example.py

    def initialize(context):
        pass


    def daj_omacku_teplu(context, data):
        pass


    def hmataj_pomaly(context, data):
        pass


    def chvatni_paku(context, data):
        pass


    def mikaj_laktom(context, data):
        pass

我需要能够在不同的python文件中从“example.py”动态导入方法,如:

    for fn in os.listdir('.'):
       if os.path.isfile(fn):
           from fn import mikaj_laktom
           mikaj_laktom(example_context, sample_data)

由于多种原因,我不能改变example.py的结构,所以我需要建立一个机制来加载方法并评估它们。我试图使用Imglib,但它只能导入一个类,而不是只定义了方法的文件。谢谢你的帮助。

共有2个答案

赏星河
2023-03-14

你在Imglib的正确轨道上。它可以用来按名称加载模块,但是我不认为你可以用这种方式将它们加载到全局命名空间中(如模块导入函数中的代码)。因此,您需要将它们加载为模块对象并调用所需的方法:

import glob, importlib, os, pathlib, sys

# The directory containing your modules needs to be on the search path.
MODULE_DIR = '/path/to/modules'
sys.path.append(MODULE_DIR)

# Get the stem names (file name, without directory and '.py') of any 
# python files in your directory, load each module by name and run
# the required function.
py_files = glob.glob(os.path.join(MODULE_DIR, '*.py'))

for py_file in py_files:
    module_name = pathlib.Path(py_file).stem
    module = importlib.import_module(module_name)
    module.mikaj_laktom()

另外,请小心使用'.'作为您的MODULE_DIR,因为这可能也会尝试加载当前的python文件,这可能会导致一些意外的行为。

编辑:如果使用Python2,则标准库中没有pathlib,因此请使用

module_name = os.path.splitext(os.path.split(py_file)[1])[0]

获取路径.stem的等价项。

须峰
2023-03-14

Pythonimport不支持使用路径进行导入,因此需要将文件作为模块进行访问,请参见(sys.path)。假设现在您的源代码与主脚本位于同一文件夹中,我将使用以下(或类似)方法:

import sys

def load_module(module):

    # module_path = "mypackage.%s" % module
    module_path = module

    if module_path in sys.modules:
        return sys.modules[module_path]

    return __import__(module_path, fromlist=[module])

# Main script here... Could be your for loop or anything else
# `m` is a reference to the imported module that contains the functions
m = load_module("example")
m.mikaj_laktom(None, [])

源文件也可以是另一个软件包的一部分,在这种情况下,您需要在与.py文件(请参见软件包)相同的文件夹中使用\uuuu init\uuuuuuuuuuuupy,并使用“mypackage.module”符号导入。(请注意,顶层文件夹应位于您的路径中,在上面的示例中,这是包含“mypackage”的文件夹)

UDPATE:

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

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

  • 问题内容: 我有一台受信任的远程服务器,其中存储了许多自定义Python模块。我可以通过HTTP(例如,使用)作为文本/纯文本来获取它们,但是我无法将获取的模块代码保存到本地硬盘上。如何将代码作为完全可操作的Python模块(包括其全局变量和导入)导入? 我想我必须使用和模块功能的某种组合,但是我还无法使其工作。 问题答案: 看起来这应该可以解决问题:导入动态生成的模块 另外,按照ActiveSt

  • 本文向大家介绍Python之csv文件从MySQL数据库导入导出的方法,包括了Python之csv文件从MySQL数据库导入导出的方法的使用技巧和注意事项,需要的朋友参考一下 Python从MySQL数据库中导出csv文件处理 csv文件导入MySQL数据库 注: 1.csv文件的表头如: mysql的创建tb_csv表语句 这里为了省事,表中的字段都指明varchar类型 MySQL数据库写入c

  • 问题内容: 我想动态加载模块,给定它的字符串名(来自环境变量)。我正在使用Python 2.7。我知道我可以做类似的事情: 这大致相当于 (其中)。问题是,我需要相当于 因为我希望能够访问模块中的所有方法和变量。我试过了 但是这样做会导致很多错误。有没有一种方法可以在Python 2.7中动态导入模块的所有方法和属性? 问题答案: 如果您有模块对象,则可以模仿逻辑用法,如下所示: 但是,这几乎肯定

  • 问题内容: 我有一个页面,可根据用户输入呈现不同的组件。目前,我已经对每个组件的导入进行了硬编码,如下所示: 但是,我一直都在更改/添加组件。有没有办法使文件仅存储组件的名称和路径,然后将它们动态导入另一个文件中? 问题答案: 我认为对于我想要实现的目标可能有些困惑。我设法解决了我遇到的问题,并在下面显示了我的代码,其中显示了我的解决方法。 单独的文件(ComponentIndex.js): 主文