Ok. I think I have an answer.
The file structure looks like:
api/
- __init__.py
- etc...
plugins/
- plugin.py
- etc...
- MainScript.py
- PyExeCreator.py
The MainScript.py looks like:
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()
The api/__init__.py looks something like:
MOTD="HI"
def Run():
global MOTD
print "API MOTD: "+MOTD
Probably would be a more exciting an API. plugins/plugin.py
import api
def Run():
api.MOTD="HELLO WORLD!"
print "This is a plugin running!"
And importantly the compiler PyExeCreator.py
from distutils.core import setup
import py2exe
setup(
name='Tester',
console=['Loader.py'],
packages=['api']
)
The key bits I was missing was including the API in packages
for distutils
and setting the search directory for the current directory (sys.path.append(os.getcwd())
)