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。
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
| 归档时间: |
|
| 查看次数: |
8427 次 |
| 最近记录: |