我可以在PYTHONPATH中找到资源文件吗?

时间:2017-08-21 23:27:51

标签: python

我想在我的PYTHONPATH中保留一个资源文件(实际上是脚本之间共享但不是Python本身),以便它可以被该路径中的模块使用,而这些模块又被调用由不同的结尾脚本/应用程序。

PYTHONPATH
  |
  |--Module1.py
  |--Module2.py
  |--Resource.res

有没有办法可以轻松引用位于PYTHONPATH层次结构下的资源(Resource.res)文件以及共享的实际Python模块,而不提供文件的完整路径?从Java的类路径中获取资源文件的方法是相同的,这是我得到这个想法的地方。

资源文件的内容应该是无关紧要的,但为了说明起见,它可能是任何非pythonic的,例如随机数据,配置等。

3 个答案:

答案 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 /等等)都可以正常工作。