【问题标题】:how to import all files from different folder in Python如何从Python中的不同文件夹导入所有文件
【发布时间】:2017-06-29 13:04:41
【问题描述】:

在目录中有__init__.py,我可以通过

导入它
from subdirectory.file import *

但我希望导入该子目录中的每个文件;所以我尝试了

from subdirectory.* import *

这不起作用。有什么建议吗?

【问题讨论】:

  • 也许我的回答有点快,是不是 对于 subdirectory 中的每个 模块您想要执行 from module import *(对于可变数量的模块)?尽管我不推荐这样做,因为它确实使您的命名空间变得混乱。最好把事情放在范围内。
  • 在我的子目录中,我的文件只包含一个函数。稍后我将添加更多文件,并且我希望我的代码能够自动导入所有内容。另外,我有 2 个这样的目录。我认为您的回答应该可以解决我的问题,除非我每次将文件添加到子目录时都必须手动导入它们并添加导入。

标签: python python-import importerror


【解决方案1】:

在尝试了一些不同的解决方案后找到了这个方法(如果你在相邻的目录中有一个名为“文件夹”的文件夹):

for entry in os.scandir('folder'):
    if entry.is_file():
        string = f'from folder import {entry.name}'[:-3]
        exec (string)

【讨论】:

  • 我喜欢这个,因为我可以通过将其添加到循环中轻松过滤:if entry.name[0] != '_':
【解决方案2】:

如果你有以下结构:

$ tree subdirectory/
subdirectory/
├── file1.py
├── file2.py
└── file3.py

并且您希望程序自动拾取位于此 subdirectory 中的每个模块并以某种方式对其进行处理,您可以按如下方式实现它:

import glob

# Get file paths of all modules.
modules = glob.glob('subdirectory/*.py')

# Dynamically load those modules here.

有关如何动态加载模块,请参阅this question


在您的subdirectory/__init__.py 中,您可以通过以下方式导入所有本地模块:

from . import file1
from . import file2
# And so on.

您可以通过

导入本地模块的内容
from .file1 import *
# And so on.

然后您可以通过

导入这些模块(或内容)
from subdirectory import *

使用__init__.py 中的属性__all__,您可以控制在from ... import * 语句期间将导入的确切内容。因此,如果您不想导入 file2.py,例如,您可以这样做:

__all__ = ['file1', 'file3', ...]

您可以通过

访问这些模块
import subdirectory
from subdirectory import *

for name in subdirectory.__all__:
    module = locals()[name]

【讨论】:

  • 我该如何使用__all____all__ 似乎是一个文件名字符串列表。是否在 for 循环中迭代 __all__ 并导入?
  • @MoneyBall 我编辑了我的答案。如果您真的想导入所有内容,可以在__init__.py 中使用from .file import *。请注意,如果不同的模块具有相同名称的属性,它们将相互影响。您可能还想看看this answer
  • 不会有任何重叠,因为每个函数都与其文件名相同。对不起,但我还是很困惑。你有module = locals()[name]。这条线到底在做什么?
  • 还有更简单的方法来导入__init__.py 中的所有内容吗?喜欢from * import *
  • @MoneyBall from subdirectory import * 将不同的模块带入本地命名空间 (locals())。 module = locals()[name] 为您提供特定 name 的模块。然后,您可以通过getattr(module, name) 访问其属性(如果函数与模块同名)。如果您希望您的程序自动实现新模块,那么您可以通过glob.glob('subdirectory/*.py')dynamically load 这些模块解析目录。
【解决方案3】:

您的__init__.py 文件应如下所示:

from file1 import *
from file2 import *

然后你可以这样做:

from subdirectory import *

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2016-02-19
    • 2016-10-14
    • 1970-01-01
    • 2011-05-21
    • 2017-11-22
    相关资源
    最近更新 更多