我正在创建游戏引擎,文件的结构如下:
/Game
game.py
/PyEngine
__init__.py
main.py
/dict
__init__.py
dict_entity.py
dict_map.py
etc
/lib
__init__.py
entity.py
map.py
etc
/Graphics
/entity
/player
/player_stand.png
/player_run.png
etc
现在,将模块导入“ game.py”或“ main.py”很简单...问题是,例如,如果我希望将“ entity_dict.py”导入“ entity.py”,如何我该怎么办?如果要在“ entity.py”中上传文件“ player_stand.png”,我该怎么办?最重要的是,我希望“ entity.py”获得仅具有名称的“ player_stand.png”路径。这样,如果文件不存在(例如,文件删除不正确),我可以将错误提供给播放器。我在网上搜索,但没有找到可以解决我的问题的解决方案,因此我向您寻求建议。
答案 0 :(得分:1)
问题是,例如,如果我希望将“ entity_dict.py”导入“ entity.py”,该怎么办?
给出项目结构
/base
main_script.py
/parentpackage
__init__.py
/childpackage1
__init__.py
mod1.py
/childpackage2
__init__.py
mod2.py
您要从mod1
导入mod2
,有两个选择。
使用相对进口
from ..childpackage1 import mod1
使用绝对导入
from parentpackage.childpackage1 import mod1
两者都可以。
前者要求parentpackage
是一个程序包(包括__init__.py
文件),否则您将收到类似ValueError: attempted relative import beyond top-level package
的错误。
后者没有此限制,但是如果您重命名了父包,则必须进入并更新所有导入(最初并不真正关心parentpackage
的导入) ,并且只是使用它进入childpackage1
)。
由于在您的情况下,parentpackage
是合适的软件包,因此首选第一个选项。
最重要的是,我希望“ entity.py”获得仅具有名称的“ player_stand.png”路径。
这更简单-您可以查看glob
模块。
编辑:
您可以使用以下功能将文件名转换为绝对路径名。
import os
import glob
GRAPHICS_PATH = <something>
def get_graphic_path(*parts):
return os.path.join(GRAPHICS_PATH, *parts)
def find_graphic_path(filename):
return glob.glob(os.path.join(GRAPHICS_PATH, '**', filename), recursive=True)
如何定义GRAPHICS_PATH
取决于您,并且取决于很多事情。您可以将其硬编码为字符串(绝对或相对)。您可以使用__file__
或sys.argv[0]
以及os.path.join
和os.path.dirname
的某种组合来相对于(a)这些函数出现的文件或(b)您的文件定义它分别是game.py脚本。