【问题标题】:How to add a json credential file of Google drive api alongwith the code when packaging the code written in python?打包python编写的代码时,如何在代码中添加谷歌驱动api的json凭证文件?
【发布时间】:2023-05-03 16:45:01
【问题描述】:

我在 python 中编写了一个函数,它使用 json 文件作为 Google drive API 的凭据文件。该函数将 google sheet URL 作为输入,并在 gspread 库的帮助下绘制图形。如果我必须制作该函数的一个包,我应该如何包含具有相同路径的 json 文件以使该函数作为一个包工作?我也尝试使用 data_files 和 MANIFEST.in 文件,但没有用。在构建包时,我仍然收到错误:

No file named credentials.json found

当我测试包时:

pip install -e .

我正在使用 setuptools 来打包代码。任何帮助表示赞赏。

【问题讨论】:

    标签: python google-drive-api setuptools python-packaging gspread


    【解决方案1】:

    setuptools 具有三种不同的方式来指定应与项目一起打包的数据文件,Manifest.indata_filespackage_data。对于源代码树下的配置文件,package_data 通常是最容易使用的。


    给定一个非常小的示例项目,如下所示:

    .
    ├───setup.py
    └───tmp
        ├───__init__.py 
        └───keys.json
    

    您需要一个至少具有此配置的setup.py 文件来打包tmp 下的所有代码和.json 文件:

    from setuptools import setup
    
    setup(
        name="tmp",
        version="0.1.0",
        packages=["tmp"],
        package_data={"tmp": ["*.json"]},
    )
    
    

    keys.json 文件仅包含 {"key": "foo"}

    从你的包中解析打包的配置文件最安全的方法是使用importlib.resources 来访问它,特别是它的path 函数(如果你被困在python 3.7 或更早版本上,importlib_resources 是一个等效的 pip -可安装的反向端口):

    tmp/__init__.py

    from importlib import resources
    import json
    
    def print_keys():
        with resources.path("tmp", "keys.json") as foo_path:
            print(json.load(foo_path.open()))
    

    一旦我用pip install -e . 安装了这个包,我就可以运行了:

    >>> import tmp
    >>> tmp.print_keys()
    {'key': 'foo'}
    

    如果您打算暂时使用 python 打包,请考虑使用比 setuptools 更现代的构建后端,例如 poetryflit。它们使体验很多更容易忍受。

    【讨论】:

    • 我试过这样做,但至少在我的情况下它不起作用。它仍然显示 No .json file found.
    • 你确定json文件的路径正确吗?如果它甚至在本地可编辑安装期间都不起作用,那么在打包期间就不会发生错误 - 所以它应该在文件访问期间发生
    最近更新 更多