导入当前目录中的所有文件

2024-06-24 13:40:24 发布

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

我刚刚开始一个python项目。目录结构如下:

/algorithms  
----/__init__.py  
----/linkedlist  
--------/__init__.py  
--------/file1.py  
--------/file2.py  
/tests  
----/test_linkedlist

您还可以检查Github repository。你知道吗

algorithms下的每个子文件夹中,在__init__文件中,我逐一为所有文件包含以下内容:

from .file1 import *
from .file2 import *

等等。你知道吗

我尝试实现的任务是使用以下查询同时运行所有测试:

python3 -m unittest discover tests

tests目录中的每个文件如下所示:

from algorithms.linkedlist import *  
import unittest

现在,如果我想向linkedlist目录添加一个新文件,我将创建该文件,然后在__init__文件中添加另一个from .filename import *。你知道吗

如何在__init__文件中编写脚本,以便每次创建新文件时不必手动插入import命令?你知道吗


Tags: 文件项目frompytestimport目录init
1条回答
网友
1楼 · 发布于 2024-06-24 13:40:24

所以__init__在同一个文件夹中?正如docs所说,import语句是__import__函数的语法糖。

所以我们可以使用:

import importlib
import glob
for file in glob.iglob('*.py'):
    importlib.__import__(file)

这不起作用的一些原因:

  • 您希望加载模块中的函数import * from。使用此代码只能运行file1.test。你知道吗
  • 从另一个目录加载脚本,这会混淆glob。我们必须指定实际的工作目录。你知道吗
  • __import__更喜欢知道模块名。你知道吗

为了找到解决方案,我将来自this答案的import * from函数与来自this博客的pkgutil.walk_packages结合起来。你知道吗

import importlib
import pkgutil 

def custom_import_all(module_name):
    """ Use to dynamically execute from module_name import * """
    # get a handle on the module
    mdl = importlib.import_module(module_name)

    # is there an __all__?  if so respect it
    if "__all__" in mdl.__dict__:
        names = mdl.__dict__["__all__"]
    else:
        # otherwise we import all names that don't begin with _
        names = [x for x in mdl.__dict__ if not x.startswith("_")]

    # now drag them in
    globals().update({k: getattr(mdl, k) for k in names})


__path__ = pkgutil.extend_path(__path__, __name__)
for importer, modname, ispkg in pkgutil.walk_packages(path=__path__, prefix=__name__+'.'):
    custom_import_all(modname)

相关问题 更多 >