从文件夹动态导入所有模块

Eri*_*ans 4 python import module python-import python-3.x

我知道存在这个问题,但它们不仅不起作用,而且也不完全是我想要的。我正在开发一款赛车游戏,想要动态加载文件夹中的所有赛道(它们存储为 .py 而不是 .json)。我不想知道曲目的名称,因为用户可以随意修改/添加它们。我只想导入他们的数据。因此,例如:

>tracks 
>>track0.py
>>track1.py
>>track2.py
>>track3.py
>>track4.py
Run Code Online (Sandbox Code Playgroud)

在每个轨道中,我都有这样的数据:

track_ground_data = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1],
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1],
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1],
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
Run Code Online (Sandbox Code Playgroud)

我需要像这样导入每个轨道模块:

loaded_tracks = [t for t in tracks] # Where tracks is the folder.
Run Code Online (Sandbox Code Playgroud)

然后track_ground_data像这样访问给定的:

loaded_tracks[0].track_ground_data
Run Code Online (Sandbox Code Playgroud)

如果我知道 Python 对其导入会如此苛刻,我就会使用 json 而不是 .py。

Bak*_*riu 7

Python 不会自动导入包中包含的子模块。因此import tracks 加载tracks/__init__.py.

但是,您可以将代码放入__init__.py文件中,以导入在该目录中找到的所有模块。

例如,将这样的内容放入__init__.py

import os
import importlib

__globals = globals()

for file in os.listdir(os.path.dirname(__file__)):
    mod_name = file[:-3]   # strip .py at the end
    __globals[mod_name] = importlib.import_module('.' + mod_name, package=__name__)
Run Code Online (Sandbox Code Playgroud)

应该使您的子模块在tracks.trackX仅导入时可用tracks

或者你可以使用exec

import os
import importlib

for file in os.listdir(os.path.dirname(__file__)):
    mod_name = file[:-3]   # strip .py at the end
    exec('import .' + mod_name)
Run Code Online (Sandbox Code Playgroud)

更简洁的方法是使用导入钩子或实现您自己的自定义模块导入器。有多种方法可以使用importlib另请参阅来执行此操作sys.path_hooks