我正在创建游戏引擎,文件的结构如下:
/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”的路径,只有这个名称。通过这种方式,如果文件不存在(例如,它被错误删除),我可以将错误通知给播放器。我在网上搜索了一下,但没有找到接近我的问题的解决方案,所以我向你请教。
发布于 2018-07-02 04:18:04
问题是,例如,如果我希望将"entity_dict.py“导入到"entity.py”中,我应该怎么办?
给定项目结构
/base
main_script.py
/parentpackage
__init__.py
/childpackage1
__init__.py
mod1.py
/childpackage2
__init__.py
mod2.py
如果您想从mod2
导入mod1
,您有两个选择。
使用相对导入
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脚本来定义它。
https://stackoverflow.com/questions/51126623
复制相似问题