【问题标题】:python import * from subdirectory not workingpython import * from subdirectory不起作用
【发布时间】:2021-07-19 14:30:28
【问题描述】:

所以我有这样的结构:

main_folder
├── main.py
├── folder1
    ├── function1.py
    └── function2.py
    └── ...
    └── function20.py

我想将文件夹 1 中的所有文件导入到 main.py 中

当我写from folder1 import * 时它不起作用,但是当我专门写from folder1 import function1 时它起作用。考虑到我在folder1 下有许多脚本,我希望将它们全部导入而不输入每个名称。有没有办法做到这一点(比如import *)?

【问题讨论】:

  • from X import * 仅将全局名称导入到X。子模块 X.Y 在导入之前实际上不会添加到 X,并且 from X import * 不会导入子模块。
  • 导入所有这些的正确方法是什么? @MisterMiyagi
  • 我会说“把它们都写出来”,但问题似乎排除了这一点。
  • 您可以在 __init__.py 中的 folder1 中包含一个 __all__ = ['function1', 'function2', ..., 'function20'],但您仍然必须至少“将它们全部写出来”一次。
  • 您可以做一些非常骇人听闻的事情,例如遍历 __init__.py 中的子目录,将符合子模块标准的所有内容附加到 __all__,但我不推荐这样做。跨度>

标签: python python-3.x


【解决方案1】:

列出当前文件夹中的所有python(.py)文件,并将它们作为__all__变量放在__init__.py

from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]

导入 * 不是一个好主意,原因有几个,包括名称冲突和难以分析代码。

【讨论】:

  • 请注意,如果包存储在 zip 文件或不在文件系统上的任何其他结构中,这将不起作用。这可能需要importlib 才能正确完成。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2018-12-09
  • 1970-01-01
相关资源
最近更新 更多