导入文件夹中所有文件中的所有类(或函数),就像它们都在

2024-04-29 09:42:43 发布

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

我有一个包含多个文件的文件夹,其中包含许多不同的类。这些文件都可以放在一个大文件中,但是为了使它更容易阅读,我根据类所属的类将其拆分为多个文件。

我想将文件夹中所有文件中的所有类导入到__init__文件中,这样我就可以从文件夹中导入任何内容,而不知道它属于哪个文件。

示例:

/kitchen
 + __init__.py
 + fridge.py
 + stove.py
 + cupboard.py

现在我必须做

from kitchen.fridge import milk

当我想做的时候

from kitchen import milk

相当于我可以通过__init__.py做的事情:

from kitchen.fridge import *
from kitchen.stove import *
from kitchen.cupboard import *

然后我就可以

from kitchen import milk

但我希望它不必显式地指定文件夹中的所有文件(以便文件可以转储到那里然后使用)。

有办法吗?


Tags: 文件frompyimport文件夹示例内容init
3条回答

这是个很坏的主意。如果你想添加一个机制,让文件被“转储到那里并使用”,你可能需要想出一个插件方案,并显式地搜索插件目录。

通常的方法是使用os.listdiros.walk迭代一个或多个插件目录,然后,对于每个Python文件,使用importlib(或Python 2.x中imp的较低级别等价物)按路径导入它。

但是,如果您真的坚持要在包中以这种方式伪造东西,那么您可以在__init__.py文件中使用os.path.dirname(__file__)作为插件目录执行基本相同的技巧。

而且,如果您真的坚持使用from foo import *而不是import foo的路径,那么这同样简单,或者,您也可以使用execfile

如果你不知道如何做这些简单的事情,或者不知道如何在文档中查找它们…那么你绝对不应该尝试这样做。所以,在这种情况下,我不会提供示例代码。

import os, sys

dir_path = os.path.dirname(os.path.abspath(__file__))
files_in_dir = [f[:-3] for f in os.listdir(dir_path)
                if f.endswith('.py') and f != '__init__.py']
for f in files_in_dir:
    mod = __import__('.'.join([__name__, f]), fromlist=[f])
    to_import = [getattr(mod, x) for x in dir(mod)]
               # if isinstance(getattr(mod, x), type)]  # if you need classes only

    for i in to_import:
        try:
            setattr(sys.modules[__name__], i.__name__, i)
        except AttributeError:
            pass

显式比隐式好。别这样。你当然可以把一些东西组合在一起,在某种程度上实现自动导入。但这真的不值得。在__init__.py中,每添加一个文件只需多出一行,就完成了。简单的解决方案更好,除非你从更复杂的解决方案中得到很多,这里肯定不是这样。

相关问题 更多 >