【问题标题】:Python - Accessing Application Resources without Filepath DependancyPython - 在没有文件路径依赖的情况下访问应用程序资源
【发布时间】:2013-11-17 18:08:02
【问题描述】:

我目前正在开发一个使用特定图像资源的PyGame 应用程序。我目前在桌面(Windows)上持有该应用程序。我写了这段代码:

image_resources = "C:/Users/user/Desktop/Pygame App/app_resources/image_resources/"
sound_resources = "C:/Users/user/Desktop/Pygame App/app_resources/sound_resources/"

class GetSource:
    def background(self,image):
        return pygame.image.load(image_resources + image).convert()
    def player(self,image):
        return pygame.image.load(image_resources + image).convert_alpha()

如您所见,我通过将 .py 文件和“app_resources”文件夹放在一个目录中来组织应用程序资源,然后在“app_resources”下创建两个目录,“image_resources”和“sound_resources”。我已经对其进行了研究,但找不到任何具体的解决方案,除了将 .py 和资源放在同一目录中 - 这是我不想要的。

那么,我该如何解决这个问题,让任何人都能够使用该应用程序,无论他们将应用程序放在哪里?谢谢!

【问题讨论】:

  • 嗨!你能告诉我们那会是什么样子吗?如果有人将 application/.py 文件放在他们想要的任何地方?如果您现在尝试,它怎么行不通?
  • 例如,如果他们下载了应用程序并将文件夹放入“C:/users/Daniel/Downloaded Programs”应用程序将无法运行,因为代码显示它位于“C: /用户/用户/桌面”。我想访问不依赖文件路径的应用程序资源:)
  • 有相对文件路径。

标签: python file directory pygame filepath


【解决方案1】:

我对 pygame 没有任何经验,但是使用 python 包捆绑资源的一种解决方案是pkg_resources 模块。

然后像这样将与您的资源匹配的相对路径模式添加到您的 setup.py 中

from setuptools import setup
setup(
    ...
    packages=["myapp"],
    packages_data={
        "myapp": "relative/path/to/resources/*",
    },
    ...
)

然后你就可以访问你的数据了

import pkg_resources
data_stream = pkg_resources.resource_stream('myapp', 'relative/path/filename')
data = data_stream.read()

除了流之外,您还可以使用resource_stringresource_filename 方法,上面的链接中有详细说明。

【讨论】:

    【解决方案2】:

    您可以使用与您的.py 文件所在位置相关的目录。说目录结构是这样的

    some_directory/
    |-- myProgram.py
    |-- image_resources/
    |    +-- some_image.jpg
    +-- sound_resources/
         +-- some_sound.wav
    

    然后myProgram.py 可以找到它自己的目录:

    import os
    programDir = print os.path.dirname(os.path.realpath(__file__)) # this is the path to some_directory in the user's system
    

    然后你可以使用该路径去相对于它的任何地方。

    image_resources_path = os.path.join(programDir, "image_resources")
    sound_resources_path = os.path.join(programDir, "sound_resources")
    

    另外,尽量不要使用带空格的目录(您有一个名为 PyGame App 的目录,因为这可能会导致某些系统、库等出现问题)

    【讨论】:

    • 感谢您的建设性回答。我会尽快尝试的。提前致谢!
    • 我会说使用 pkg_resources 库是一个更高级别的解决方案,因此:更简单、更健壮和更灵活(可在更多情况下使用)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多