将包数据设置为 PyPI python 包中命令行参数的默认输入

Setting package data as default input for command line argument in a PyPI python package

我已经编写了一个命令行脚本,它需要一个包含在我的 python 包中的 csv 文件(下面的包布局)。我在命令行脚本上使用 argparse,并试图使默认的 csv 文件成为包附带的文件。 如何在我的命令行命令中将包中包含的 csv 文件指定为默认 csv 文件?

命令行 Argparse 参数:

parser = ArgumentParser()
parser.add_argument("-d", "--database", help="Database", **default="../data/database.csv"**) ## Help Here

args = parser.parse_args()

包层次结构:

package
 - bin/
    - My_Commandline_Command
 - data/
    - database.csv
 - build/ ...
 - dist/  ...
 - MANIFEST.in
 - README.md
 - setup.py
 - package/
    - __init__.py

错误:

当我在我的开发环境之外安装我的包时,我可以看到数据文件夹,但是,我的命令行脚本抛出一个错误,因为没有找到默认的数据库路径。

正如@hpaulj 所建议的,您可以将默认值设置为 None,然后专门检查这种情况:

import argparse
from pathlib import Path


parser = argparse.ArgumentParser()
parser.add_argument("-d", "--database", help="Database", default=None)

args = parser.parse_args()

if args.database is None:
    args.database = (Path(__file__).parent / "../data/database.csv").resolve()

这里我们可以使用__file__获取database.csv

的相对位置

查看 How to read a (static) file from inside a Python package? 后:我使用 ___init__.py 将数据文件夹移动到包文件夹中,并且能够使用 importlib_resources 访问数据库。不要忘记编辑 MANIFEST.in 路径。

My_Commandline_Command:

import importlib_resources

my_resources = importlib_resources.files("package")
print(my_resources)
data = (my_resources / "data" / "database").read_bytes()

包结构的变化:

package
 - bin/
    - My_Commandline_Command
 - build/ ...
 - dist/  ...
 - MANIFEST.in
 - README.md
 - setup.py
 - package/
    - __init__.py
    - data/
      - database.csv