获取仅包含文件名的文件夹的路径

时间:2018-07-01 20:02:08

标签: python python-3.x

我正在创建游戏引擎,文件的结构如下:

/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”路径。这样,如果文件不存在(例如,文件删除不正确),我可以将错误提供给播放器。我在网上搜索,但没有找到可以解决我的问题的解决方案,因此我向您寻求建议。

1 个答案:

答案 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.joinos.path.dirname的某种组合来相对于(a)这些函数出现的文件或(b)您的文件定义它分别是game.py脚本。