使用代码存储库时如何引用资源的相对路径

2024-04-25 00:13:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在使用一个部署到Windows和Linux的代码库,有时在不同的目录中。项目中的一个模块应该如何引用项目中的一个非Python资源(CSV文件等)?

如果我们这样做:

thefile=open('test.csv')

或:

thefile=open('../somedirectory/test.csv')

只有当脚本从一个特定目录或目录的子集运行时,它才起作用。

我想做的是:

path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)

有可能吗?


Tags: 模块csvpath项目代码test目录linux
3条回答

如果您正在使用安装工具或分发(setup.py安装),那么访问这些打包资源的“正确”方法似乎是使用package_资源。

你的例子是

import pkg_resources
my_data = pkg_resources.resource_string(__name__, "foo.dat")

当然,哪个读取资源和读取的二进制数据将是我的数据的值

如果您只需要文件名,还可以使用

resource_filename(package_or_requirement, resource_name)

示例:

resource_filename("MyPackage","foo.dat")

它的优点是,即使是像鸡蛋一样的档案分发,它也能保证工作。

http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api

在Python中,路径是相对于当前工作目录的,在大多数情况下,该目录是运行程序的目录。当前工作目录很可能与模块文件的目录不同,因此使用相对于当前模块文件的路径总是一个错误的选择。

使用绝对路径应该是最好的解决方案:

import os
package_dir = os.path.dirname(os.path.abspath(__file__))
thefile = os.path.join(package_dir,'test.cvs')

尝试使用相对于当前文件路径的文件名。“./my_file”的示例:

fn = os.path.join(os.path.dirname(__file__), 'my_file')

在Python 3.4+中,还可以使用pathlib

fn = pathlib.Path(__file__).parent / 'my_file'

相关问题 更多 >