来自文件的 Python 动态导入方法

eme*_*mem 6 python

我有多个文件,其结构类似于文件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
Run Code Online (Sandbox Code Playgroud)

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

    for fn in os.listdir('.'):
       if os.path.isfile(fn):
           from fn import mikaj_laktom
           mikaj_laktom(example_context, sample_data)
Run Code Online (Sandbox Code Playgroud)

由于多种原因,我无法更改 的结构,example.py因此我需要制定一种机制来加载方法并评估它们。我尝试使用importlib但它只能导入一个类,而不是只定义了方法的文件。谢谢您的帮助。

urb*_*ban 6

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, [])
Run Code Online (Sandbox Code Playgroud)

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


UDPATE:

  • 正如@skyking 所指出的,有一些 lib 可以帮助你做同样的事情。看到这个帖子
  • 我的评论__init__.py已经过时了,因为 py3 中的事情已经发生了变化。有关更详细的解释,请参阅此帖子