如何将文件夹内的所有内容导入 Python2 中的单个模块
How to import everything inside a folder into a single module in Python2
我只是想从一个文件夹中取出我所有的 .py 文件(我现在不关心子文件夹)并将它们放入一个模块中。
我在这里遇到的用例是我正在编写一些非常标准的面向对象代码,并且我为每个 class 使用一个文件,我不想拥有将每个 class 的 from myClass import myClass
写入我的 __init__.py
。我不能使用 Python3,所以我仍在使用 imp
和 reload
等。
目前我正在使用
# 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()
我只是想从一个文件夹中取出我所有的 .py 文件(我现在不关心子文件夹)并将它们放入一个模块中。
我在这里遇到的用例是我正在编写一些非常标准的面向对象代码,并且我为每个 class 使用一个文件,我不想拥有将每个 class 的 from myClass import myClass
写入我的 __init__.py
。我不能使用 Python3,所以我仍在使用 imp
和 reload
等。
目前我正在使用
# 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()