Python—访问应用程序资源而不依赖文件路径

Python—访问应用程序资源而不依赖文件路径,python,file,directory,pygame,filepath,Python,File,Directory,Pygame,Filepath,我目前正在开发一个使用spesific图像资源的应用程序。我目前正在桌面(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/"

我目前正在开发一个使用spesific图像资源的应用程序。我目前正在桌面(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和资源放在同一个目录中——这是我不想要的


那么,我如何解决这个问题,让任何人都能够使用这个应用程序,不管他们把应用程序放在哪里?谢谢

您可以使用与
.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
,因为这可能会导致某些系统、库等出现问题)。

您可以使用与
.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
,因为这可能会导致某些系统、库等出现问题)。

我没有PyGame的任何经验,但将资源与python包捆绑在一起的一个解决方案是模块

然后将与资源匹配的相对路径模式添加到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\u string
resource\u filename
方法,这些方法在上面的链接中有详细说明。

我对pygame没有任何经验,但将资源与python包捆绑在一起的一个解决方案是模块

然后将与资源匹配的相对路径模式添加到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\u string
resource\u filename
方法,这些方法在上面的链接中有详细说明。

hi!你能告诉我们那会是什么样子吗?如果有人将应用程序/.py文件放在他们想要的任何地方?如果您现在尝试,它怎么会不起作用?例如,如果他们下载了应用程序并将文件夹放在“C:/users/Daniel/downloaded Programs”中,应用程序将不起作用,因为代码显示它位于“C:/users/User/Desktop”。我想访问不依赖文件路径的应用程序资源:)具有相对文件路径。嗨!你能告诉我们那会是什么样子吗?如果有人将应用程序/.py文件放在他们想要的任何地方?如果您现在尝试,它怎么会不起作用?例如,如果他们下载了应用程序并将文件夹放在“C:/users/Daniel/downloaded Programs”中,应用程序将不起作用,因为代码显示它位于“C:/users/User/Desktop”。我想访问不依赖文件路径的应用程序资源:)具有相对文件路径。感谢您的建设性回答。我会尽快试一试。提前谢谢!我想说的是,使用pkg_资源库是一个更高层次的解决方案,因此:更简单、更健壮、更灵活(在更多环境下可用)。感谢您提供建设性的答案。我会尽快试一试。提前谢谢!我想说的是,使用pkg_资源库是一个更高级别的解决方案,因此:更简单、更健壮、更灵活(在更多环境中可用)。