如何将文件夹内的所有内容导入 Python2 中的单个模块

How to import everything inside a folder into a single module in Python2

我只是想从一个文件夹中取出我所有的 .py 文件(我现在不关心子文件夹)并将它们放入一个模块中。

我在这里遇到的用例是我正在编写一些非常标准的面向对象代码,并且我为每个 class 使用一个文件,我不想拥有将每个 class 的 from myClass import myClass 写入我的 __init__.py。我不能使用 Python3,所以我仍在使用 impreload 等。

目前我正在使用

# this is __init__.py
import pkgutil
for loader, name, is_pkg in pkgutil.walk_packages(__path__):
    if not is_pkg:
        __import__(__name__ + "." + name)

它似乎不起作用,它包含包,但将它们作为模块包含,因此我必须为文件中定义的 class 编写 MyClass.MyClass是自己的名字。这很愚蠢,我不喜欢它。

我一直在寻找,只是越来越困惑这个看似标准的用例看起来有多复杂。 python 开发人员是否只是将所有内容写入一个文件?还是他们总是有大量的 import

这是否应该以完全不同的方式来处理?

你真正想做的事

要完成这项工作,您需要将您的 class 名称绑定 到您的 __init__.py 脚本的命名空间。 完成此步骤后,您将能够 from YourPackageName import * 并直接使用您的 classes。像这样:

import YourPackageName 
c = YourPackageName.MyClass()

from YourPackageName import *
c = MyClass()

实现此目标的方法

您有多种动态导入模块的方法:__import__()__all__

但是

将名称绑定到当前模块的命名空间的唯一方法是使用 from myClass import myClass 语句。静态语句。

换句话说,每个 __init__.py 脚本的内容应该如下所示:

#!/usr/bin/env python
# coding=utf-8

from .MySubPackage import * 
from .MyAnotherSubPackage import * 
from .my_pretty_class import myPrettyClass
from .my_another_class import myAnotherClass
...

而且你应该知道,即使对于动态 __all__

It is up to the package author to keep this list up-to-date when a new version of the package is released.

(https://docs.python.org/2/tutorial/modules.html#importing-from-a-package)


所以明确回答你的问题:

Do python devs just write everything into a single file?

不,他们没有。

Or do they always have tons of imports?

差不多。但绝对不是吨。您只需将每个模块导入一次(导入适当的 __init__.py 脚本)。然后一次导入整个包或子包。


例子

假设有下一个包结构:

MyPackage
    |---MySubPackage
    |       |---__init__.py
    |       |---pretty_class_1.py
    |       |---pretty_class_2.py
    |---__init__.py
    |---sleepy_class_1.py
    |---sleepy_class_2.py

MyPackage/MySubPackage/__init__.py的内容:

#!/usr/bin/env python
# coding=utf-8

from .pretty_class_1 import PrettyClass1
from .pretty_class_2 import PrettyClass2

MyPackage/__init__.py 的内容:

#!/usr/bin/env python
# coding=utf-8

from .MySubPackage import *
from .sleepy_class_1 import SleepyClass1
from .sleepy_class_2 import SleepyClass2

因此,现在我们可以在应用程序中编写下一段代码了:

import MyPackage

p = MyPackage.PrettyClass1()
s = MyPackage.SleepyClass2()

from MyPackage import *

p = PrettyClass1()
s = SleepyClass2()