编辑:原来问题与路径有关。
如果我 cd 进入包含库的目录并运行python __init__.py
导入,一切正常。如果我在不同的目录中并尝试导入库本身(即在父目录中并尝试导入),则会发生故障。
我看不到任何方法可以从字面上指定导入语句的路径。
所以,我想知道最好的方法是否只是将 scriptDir 中的目录添加到 sys.path 中?这是最好的方法吗?我觉得应该有一个更优雅的方法,但是......
我想编写一个可以很容易扩展的库。
这是我想做的一些骨架/伪代码。实际上,这段代码要复杂得多,但它遵循基本前提——导入每个文件,检查它,并确定我们是否应该使用它;然后将其分配到模块引用列表中。所有这些都将包含在一个库文件夹中。
我希望库在导入时动态导入在其目录中以“plugin_”开头的任何文件。见代码:
初始化.py:
import os.path
scriptDir = os.path.dirname(__file__)
mods = []
thisMod = 0
for file in os.listdir(scriptDir):
if (file[0:7] == "plugin_" and file[-3:] == ".py"):
thisMod = __import__(".".join(file.split(".")[0:-1]))
print "debug: imported %s" % thisMod.modName
if (thisMod.enable == True):
mods.append(thisMod)
else:
print "debug: not loading %s because it's disabled." % thisMod.modName
def listMods():
"This function should print the names of all loaded modules."
for m in mods:
print "debug: module %s" % m.modName
def runMods():
"This function should execute the run method for ALL modules."
for m in mods:
c = m.ModuleClass()
c.run()
def selectMod(modNum):
"This function should let us select a single module for the runSelectedMod function."
thisMod = mods[modNum]
def runSelectedMod():
"This function should run the 'run' method for ONLY the previously selected module."
if (thisMod == 0):
raise ArgumentError("you didn't assign a module yet.")
c = thisMod.ModuleClass()
c.run()
plugin_test1.py
modName = "test module 1"
enable = True
class ModuleClass:
def run(self):
print "test module 1 is running"
plugin_math.py
modName = "math module"
enable = True
class ModuleClass:
def run(self):
print "mathematical result: %d" % (1+1)
plugin_bad.py
modName = "bad module"
enable = False
class ModuleClass:
def __init__(self):
print "x"[4] # throws IndexError, this code should not run.
def run(self):
print "divide by zero: %f" % (5 / 0) # this code should not run.
我已经发现的问题是导入不起作用,因为我不是导入整个库,而是导入单个文件。我猜是否有为此目的导入的替代语法?例如,import plugin_test
并且from plugin_math import ModuleClass
工作,但我对import的使用不是。我收到一个错误:
thisMod = __import__(".".join(file.split(".")[0:-1]))
ImportError: No module named plugin_test1
现在,另一个问题是:如果我使用 py2exe、py2app 等将它编译成一个紧凑的库,这将如何工作?如果我记得,这些应用程序不是将所有本地库压缩到一个 site_packages.zip 文件中吗?...
我仍在学习如何在 Python 中进行这种高级编码,因此不胜感激。
谢谢!