我可以在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')
返回一个字符串。