我有一个python 2.6 Django应用程序,它的文件夹结构如下:
/foo/bar/__init__.py
我在文件系统上有另外两个目录,其中充满了这样的python模块:
^{pr2}$每个模块__init__
都有一个类。例如,module1Class()
和{module2
中,file.py
包含一个名为myFileClass()
的类。在
我想做的是在/foo/bar/__init__.py
中放入一些代码,这样我就可以像这样导入我的Django项目了:
from foo.bar.module1 import module1Class
from foo.bar.module2 import module2Class
from foo.bar.module2.file import myFileClass
包含模块的目录列表包含在Django配置的元组中,如下所示:
module_list = ("/modules", "/other_modules",)
我尝试过使用__import__
和vars()
动态生成如下变量:
import os
import sys
for m in module_list:
sys.path.insert(0, m)
for d in os.listdir(m):
if os.path.isdir(d):
vars()[d] = getattr(__import__(m.split("/")[-1], fromlist=[d], d)
但似乎不管用。有办法吗?在
谢谢!在
我们最终忍痛割爱,改变我们做事的方式。现在在Django配置中传递查找模块的目录列表,并将每个目录添加到系统路径(类似于阿雅提到的一句话,也是我之前做过但不太满意的事情)。然后,对于它内部的每个模块,我们检查一个
__init__.py
,如果它存在,尝试将它作为一个模块来使用,而不使用foo.bar
块。在这需要对我们如何与模块交互以及开发人员如何编写模块进行一些调整(他们现在需要在模块内使用相对导入,而不是以前使用的完整路径导入),但我认为这将是开发人员更容易长期使用的设计。在
我们没有将这些添加到已安装的应用程序中,因为我们进行了一些异常处理,如果由于依赖关系问题或错误代码而无法导入模块,则软件将继续运行,而不使用该模块。如果它们安装在已安装的应用程序中,我们就无法在何时/如何处理这些异常时利用这种灵活性。在
谢谢你的帮助!在
我可以看到你的代码至少有一个问题。线。。。在
…不起作用,因为
os.listdir()
返回相对路径名,因此您需要将它们转换为绝对路径名,否则,os.path.isdir()
将返回False
,因为该路径不存在(相对于当前工作目录),而不是引发异常(这将更有意义,IMO)。在下面的代码对我有用。。。在
^{2}$更新
考虑一下,检查}将失败。在
__init__.py
的存在可能更安全,而不是使用os.path.isdir()
,以防有子目录不包含这样的文件,否则{所以你可以换台词。。。在
…到。。。在
……但可能没必要。在
相关问题 更多 >
编程相关推荐