首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python插件能力

Python插件能力
EN

Stack Overflow用户
提问于 2013-07-29 13:55:41
回答 1查看 200关注 0票数 2

我正在用python编写一个应用程序,它将被导出到带有py2exe的可执行文件中。我正在尝试编写一个插件系统,当应用程序是一个exe时,它可以工作。

我的原始代码看起来

代码语言:javascript
复制
import os
Plugins=os.listdir('plugins')
for P in Plugins:
    PItems=os.path.splitext(P)
    PName=PItems[0]
    if PItems[len(PItems)-1]=='.py':
        Mod=__import__('plugins.'+PName,fromlist=['*'])
        Mod.init()

但是当导出到exe时,它在尝试导入时找不到模块'plugins.(pluginName)‘。

插件还应该能够导入my_application来访问applications。

mcEdit (用python编写)和崇高的文本 (不确定)可以做到这一点,但是尽管拖网搜索源代码,我还是找不到方法。

如何编写导出到exe时工作的东西?

编辑:澄清

  • 当应用程序加载时,应该自动加载插件。它们存储在plugins/目录中。
  • 插件应该能够与应用程序进行import myapplication交互,然后运行api调用(如myapplication.getFoo()myapplication.setBar(Bar) )。
  • 这些插件可以在鼠标单击或移动等事件上运行一次,甚至每次绘制屏幕时都可以运行。我希望他们保持自己的状态(变量值,对象等)当应用程序运行时。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-01 08:11:56

好的。我想我有答案了。

文件结构如下所示:

代码语言:javascript
复制
api/
  - __init__.py
  - etc...
plugins/
  - plugin.py
  - etc...
- MainScript.py
- PyExeCreator.py

MainScript.py看起来像:

代码语言:javascript
复制
import os,sys, api

RootDir=os.getcwd() 
#Add this directory to export
if RootDir not in sys.path:
    sys.path.append(RootDir)

#Plugin stuff
def LoadPlugins():
    PluginsDir=os.path.join(RootDir,'plugins')
    Plugins=os.listdir(PluginsDir)

    Modules=[]
    for P in Plugins:
        PItems=os.path.splitext(P)
        PName=PItems[0]
        if PName!='__init__' and PItems[len(PItems)-1]=='.py':
            print "Loading plugins."+PName
            Mod=__import__("plugins."+PName,fromlist=['*'])
            Modules.append(Mod)
    return Modules
def RunPlugins(Modules):
    for Plugin in Modules:
        Plugin.Run()

Plugins=LoadPlugins()

#Just checking plugins can modify variables.
api.Run()
RunPlugins(Plugins)
api.Run()

api/__init__..py看起来类似于:

代码语言:javascript
复制
MOTD="HI"
def Run():
    global MOTD
    print "API MOTD: "+MOTD

可能会是一个更令人兴奋的API。plugins/plugin.py

代码语言:javascript
复制
import api
def Run():
    api.MOTD="HELLO WORLD!"
    print "This is a plugin running!"

更重要的是编译器PyExeCreator.py

代码语言:javascript
复制
from distutils.core import setup
import py2exe

setup(
    name='Tester',
    console=['Loader.py'],
    packages=['api']
)

我丢失的关键位包括packages for distutils中的API和设置当前目录(sys.path.append(os.getcwd()))的搜索目录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17925979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档