Python—访问应用程序资源而不依赖文件路径
我目前正在开发一个使用spesific图像资源的应用程序。我目前正在桌面(Windows)上保存应用程序。我编写了以下代码: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/"
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_资源库是一个更高级别的解决方案,因此:更简单、更健壮、更灵活(在更多环境中可用)。