【发布时间】:2013-07-29 13:55:41
【问题描述】:
我正在用 python 编写一个应用程序,它将通过 py2exe 导出到一个可执行文件。我正在尝试编写一个插件系统,该系统在应用程序是 exe 时可以工作。
我的原始代码看起来像
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 以访问应用程序 api。
mcEdit(用 python 编写)和Sublime Text(不确定)可以做到这一点,但尽管搜索了源代码,但我找不到方法。
如何编写导出到 exe 时可以使用的内容?
编辑: 澄清
- 插件应在应用程序加载时自动加载。它们存储在
plugins/目录中 - 插件应该能够通过
import myapplication与应用程序交互,然后运行一个api调用,例如myapplication.getFoo()或myapplication.setBar(Bar) - 这些插件可以运行一次,也可以在鼠标单击或移动之类的事件上运行,甚至在每次绘制屏幕时运行。我希望他们在应用程序运行时保持其状态(变量值、对象等...)。
【问题讨论】:
-
您确定当前的工作目录是您所期望的并且在您的模块搜索路径中吗? (这是我在处理动态加载模块时的主要问题。但我没有使用 py2exe)
-
检查
os.getcwd()和sys.path -
路径正确。我得到的确切错误消息是 ImportError: No module named plugins.plugin.
-
要使您的导入语句起作用,您的
plugins文件夹需要是一个包;这意味着它必须包含一个__init__.py文件。 -
@l4mpi
plugins/确实包含一个 init.py 文件。