py2exe编译cod中未编译python插件的动态加载

2024-04-25 10:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Python应用程序是这样构造的,一些功能可以作为插件使用。目前的插件架构非常简单:我有一个plugins文件夹/包,其中包含一些python模块。我加载相关插件如下:

plugin_name = blablabla
try:
    module = __import__(plugin_name, fromlist='do_something')
except ImportError:
   #some error handling ...

然后执行:

^{pr2}$

我使用py2exe将应用程序编译为Windows二进制文件。除了所有插件都(而且必须)包含在二进制文件中之外,这一切都很好。这不太实用,因为对于每个新插件,我都必须重新编译并发布应用程序的新版本。如果一个新的插件(即python文件)可以复制到某个应用程序插件文件夹中,并且文件代码中的python代码可以由我的应用程序动态地解释,那就更好了。在

最好的方法是什么?在

(我已经阅读了所选插件文件的每一行,并对其应用^{} statement。但可能还有更好的方法……)


Tags: 模块文件方法代码name功能文件夹插件
3条回答

PyInstaller也允许您导入外部文件。如果在应用程序上运行它,它将不会将这些文件打包到可执行文件中。然后您必须确保路径是正确的(也就是说,您的应用程序可以在正确的目录中找到磁盘上的模块),并且一切都应该正常工作。在

如果您不介意插件将作为.py文件发布,您可以执行以下操作。把你所有的插件放在一个“plugin”子目录下,然后创建一个空的“yu init_uu.py”。在运行时,它将导入包以及该目录中的所有模块。查看Dive In Python以获取解释。。。但我最后还是用了这个。在

def load_plugin(path):
    import imp
    """Load plugin from directory and return list of modules"""
    files = os.listdir( path )
    test = re.compile(".py$", re.IGNORECASE)          
    files = filter(test.search, files)                     
    filenameToModuleName = lambda f: os.path.splitext(f)[0]
    moduleNames = sorted(map(filenameToModuleName, files))
    f, filename, desc = imp.find_module('plugin')
    plugin = imp.load_module('plugin', f, filename, desc)
    modules = []

    #print moduleNames
    for m in moduleNames:
        # skip any files starting with '__', such as __init__.py
        if m.startswith('__'):
            continue
        try:
            f, filename, desc = imp.find_module(m, plugin.__path__)
            modules.append( imp.load_module(m, f, filename, desc))
        except ImportError:
            continue
    return modules

我建议您使用pkg_resources entry_points特性(来自setuptools/distribute)来实现插件发现和实例化:首先,这是一种标准的方法;其次,它不会遇到您提到的问题。要扩展应用程序,您只需将一些插件打包到一个egg中,该egg声明一些入口点(一个egg可能声明许多插件),当您将该egg安装到python发行版中时,它声明的所有插件都可以被应用程序自动发现。你也可以把你的应用程序和“工厂”插件打包到同一个鸡蛋里,这很方便。在

相关问题 更多 >

    热门问题