我想在我的PYTHONPATH
中保留一个资源文件(实际上是脚本之间共享但不是Python本身),以便它可以被该路径中的模块使用,而这些模块又被调用由不同的结尾脚本/应用程序。
PYTHONPATH
|
|--Module1.py
|--Module2.py
|--Resource.res
有没有办法可以轻松引用位于PYTHONPATH层次结构下的资源(Resource.res)文件以及共享的实际Python模块,而不提供文件的完整路径?从Java的类路径中获取资源文件的方法是相同的,这是我得到这个想法的地方。
资源文件的内容应该是无关紧要的,但为了说明起见,它可能是任何非pythonic的,例如随机数据,配置等。
答案 0 :(得分:1)
编写一个执行此操作的函数是微不足道的:
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
。你也可以提出异常。
答案 1 :(得分:1)
这与@ 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
答案 2 :(得分:0)
您可以使用pkgutil.get_data
从包中读取任意文件
https://docs.python.org/3/library/pkgutil.html#pkgutil.get_data
例如,要从包中加载GIF图标:
image = pkgutil.get_data(__name__, "icon.gif")
您可以更改包参数以从不同位置加载内容。
如果你可以安装最近的setuptools
,你可以使用它们的版本,这提供了更多的可能性
http://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access
无论软件包的安装方式如何(文件系统上的单独文件,或zip / egg /等等)都可以正常工作。