1

编辑:原来问题与路径有关。

如果我 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 中进行这种高级编码,因此不胜感激。

谢谢!

4

1 回答 1

0

我能够在 Python 3 中运行它。与语法无关的唯一变化是scriptDir

import os.path

scriptDir = os.path.dirname(os.path.abspath(__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()

给出:

C:\Users\mm\Desktop\ING.SW\python>python so\dina.py
debug: imported bad module
debug: not loading bad module because it's disabled.
debug: imported math module
debug: imported test module 1

我猜你有一个不同的问题,因为文件名实际上已被读取(因为它打印在错误消息中),但仍然......

于 2013-05-16T21:34:25.417 回答