从多个目录导入python模块

2024-10-05 19:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

但似乎不管用。有办法吗?在

谢谢!在


Tags: 模块djangofrompyimport目录fooinit
2条回答

我们最终忍痛割爱,改变我们做事的方式。现在在Django配置中传递查找模块的目录列表,并将每个目录添加到系统路径(类似于阿雅提到的一句话,也是我之前做过但不太满意的事情)。然后,对于它内部的每个模块,我们检查一个__init__.py,如果它存在,尝试将它作为一个模块来使用,而不使用foo.bar块。在

这需要对我们如何与模块交互以及开发人员如何编写模块进行一些调整(他们现在需要在模块内使用相对导入,而不是以前使用的完整路径导入),但我认为这将是开发人员更容易长期使用的设计。在

我们没有将这些添加到已安装的应用程序中,因为我们进行了一些异常处理,如果由于依赖关系问题或错误代码而无法导入模块,则软件将继续运行,而不使用该模块。如果它们安装在已安装的应用程序中,我们就无法在何时/如何处理这些异常时利用这种灵活性。在

谢谢你的帮助!在

我可以看到你的代码至少有一个问题。线。。。在

if os.path.isdir(d):

…不起作用,因为os.listdir()返回相对路径名,因此您需要将它们转换为绝对路径名,否则,os.path.isdir()将返回False,因为该路径不存在(相对于当前工作目录),而不是引发异常(这将更有意义,IMO)。在

下面的代码对我有用。。。在

^{2}$

更新

考虑一下,检查__init__.py的存在可能更安全,而不是使用os.path.isdir(),以防有子目录不包含这样的文件,否则{}将失败。在

所以你可以换台词。。。在

        full_path = os.path.join(root_path, filename)
        if os.path.isdir(full_path):
            locals()[filename] = __import__(filename)

…到。。。在

        full_path = os.path.join(root_path, filename, '__init__.py')
        if os.path.exists(full_path):
            locals()[filename] = __import__(filename)

……但可能没必要。在

相关问题 更多 >