将包数据设置为 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
我已经编写了一个命令行脚本,它需要一个包含在我的 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