我正在用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来访问applications。
mcEdit (用python编写)和崇高的文本 (不确定)可以做到这一点,但是尽管拖网搜索源代码,我还是找不到方法。
如何编写导出到exe时工作的东西?
编辑:澄清
plugins/目录中。import myapplication交互,然后运行api调用(如myapplication.getFoo()或myapplication.setBar(Bar) )。发布于 2013-08-01 08:11:56
好的。我想我有答案了。
文件结构如下所示:
api/
- __init__.py
- etc...
plugins/
- plugin.py
- etc...
- MainScript.py
- PyExeCreator.pyMainScript.py看起来像:
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看起来类似于:
MOTD="HI"
def Run():
global MOTD
print "API MOTD: "+MOTD可能会是一个更令人兴奋的API。plugins/plugin.py
import api
def Run():
api.MOTD="HELLO WORLD!"
print "This is a plugin running!"更重要的是编译器PyExeCreator.py
from distutils.core import setup
import py2exe
setup(
name='Tester',
console=['Loader.py'],
packages=['api']
)我丢失的关键位包括packages for distutils中的API和设置当前目录(sys.path.append(os.getcwd()))的搜索目录。
https://stackoverflow.com/questions/17925979
复制相似问题