我可以在PYTHONPATH中找到资源文件吗?
我想在我的我可以在PYTHONPATH中找到资源文件吗?,python,Python,我想在我的PYTHONPATH中保留一个资源文件(它实际上是脚本之间共享的任何东西,但不是Python本身),以便该路径中的模块可以使用它,而这些模块又由不同的终端脚本/应用程序调用 PYTHONPATH | |--Module1.py |--Module2.py |--Resource.res 有没有一种方法可以方便地引用位于PYTHONPATH层次结构下的资源(resource.res)文件以及共享的实际Python模块,而无需提供该文件的完整路径?有一种从Java的类路径
PYTHONPATH
中保留一个资源文件(它实际上是脚本之间共享的任何东西,但不是Python本身),以便该路径中的模块可以使用它,而这些模块又由不同的终端脚本/应用程序调用
PYTHONPATH
|
|--Module1.py
|--Module2.py
|--Resource.res
有没有一种方法可以方便地引用位于PYTHONPATH层次结构下的资源(resource.res)文件以及共享的实际Python模块,而无需提供该文件的完整路径?有一种从Java的类路径获取资源文件的等效方法,这就是我的想法
资源文件的内容应该是不相关的,但为了便于说明,它可以是任何非Python的内容,例如随机数据、配置等。编写一个函数来实现这一点很简单:
import sys, os.path
def resolve(filename):
for directory in sys.path:
path = os.path.join(directory, filename)
if os.path.isfile(path):
return path
如果在路径上找不到文件,此版本将返回
None
。您还可以引发异常。编写一个函数来执行以下操作非常简单:
import sys, os.path
def resolve(filename):
for directory in sys.path:
path = os.path.join(directory, filename)
if os.path.isfile(path):
return path
如果在路径上找不到文件,此版本将返回
None
。您还可以引发异常。您可以使用pkgutil.get_data
例如,要从软件包中加载GIF图标:
image = pkgutil.get_data(__name__, "icon.gif")
您可以改变package参数以从不同的位置加载内容。
如果您可以安装最新的setuptools
,您可以使用他们的版本,这提供了更多的可能性
无论软件包是如何安装的(文件系统上的单独文件,或作为zip/egg/任何文件)。您可以使用pkgutil.get_data从软件包中读取任意文件 例如,要从软件包中加载GIF图标:
image = pkgutil.get_data(__name__, "icon.gif")
您可以改变package参数以从不同的位置加载内容。
如果您可以安装最新的setuptools
,您可以使用他们的版本,这提供了更多的可能性
无论包是如何安装的(文件系统上的单独文件,或作为zip/egg/任何文件)。这与@kindall的答案非常相似,但使用
PYTHONPATH
环境变量而不是sys.path
来确定目录搜索列表:
import os
import sys
def resource_file_path(filename):
""" Search for filename in the list of directories specified in the
PYTHONPATH environment variable.
"""
pythonpath = os.environ.get("PYTHONPATH")
if pythonpath:
for d in pythonpath.split(os.pathsep):
filepath = os.path.join(d, filename)
if os.path.isfile(filepath):
return filepath
return None
这与@kindall的答案非常相似,但使用
PYTHONPATH
环境变量而不是sys.path
来确定目录搜索列表:
import os
import sys
def resource_file_path(filename):
""" Search for filename in the list of directories specified in the
PYTHONPATH environment variable.
"""
pythonpath = os.environ.get("PYTHONPATH")
if pythonpath:
for d in pythonpath.split(os.pathsep):
filepath = os.path.join(d, filename)
if os.path.isfile(filepath):
return filepath
return None
OP特别要求使用PYTHONPATH,它与sys、path不同。可通过
os.getenv('PYTHONPATH')获得它
,因此如果他用该函数调用替换了您的sys,path应该会起作用。如果包含资源的包是从zip文件加载的,则这不起作用。@Paul:不完全起作用,因为sys.path
是一个列表,并且os.getenv('PYTHONPATH'))
返回一个string.OP,该字符串被专门要求使用PYTHONPATH,它与sys,path不同。可通过os.getenv('PYTHONPATH')获得
,因此如果他用该函数调用替换你的sys,path应该会起作用。如果包含资源的包是从zip文件加载的,则这不起作用。@Paul:不完全起作用,因为sys.path
是一个列表,os.getenv('PYTHONPATH')
返回一个字符串。