如何在基于pyproject的Python包中包含Shell脚本?
在pyproject.toml中安装Shell脚本的简便方法
有几种比编写Python包装函数更简便的方案,能达到旧setup.py里scripts参数的效果:
1. 直接在pyproject.toml中沿用setuptools的scripts配置
setuptools在新规范下依然兼容scripts参数,不需要完全抛弃旧写法。在pyproject.toml的project区块中添加:
[project] # 其他项目配置... scripts = ["scripts/myscript.sh"]
安装后脚本会直接被复制到环境的bin目录(Windows对应Scripts目录),和旧setup.py的效果完全一致。
2. 用极简Python包装脚本配合console_scripts
如果想贴合新的入口点规范,可以写一个几乎零开销的Python包装脚本,比subprocess调用更高效:
先在项目里创建一个简单的Python文件,比如src/my_package/cli.py:
#!/usr/bin/env python import os import sys from pathlib import Path # 定位Shell脚本的路径,根据你的项目结构调整层级 script_path = Path(__file__).parent.parent.parent / "scripts" / "myscript.sh" # 直接替换Python进程为Shell脚本,无额外开销 os.execv(script_path, [script_path.name] + sys.argv[1:])
然后在pyproject.toml中配置入口点:
[project.scripts] myscript = "my_package.cli:main"
这里的main可以不用定义,因为脚本在执行到os.execv时就替换了进程,不过setuptools要求入口点格式合法,随便写个存在的函数名或者直接用模块名也可以。
3. 用data_files手动指定安装路径
如果需要自定义安装路径,可以用data_files配置:
[tool.setuptools.data_files] "bin" = ["scripts/myscript.sh"]
这会把脚本直接安装到环境的bin目录,注意Windows系统需要把路径改成Scripts,类Unix系统通用。
内容的提问来源于stack exchange,提问作者ZJaume
相关产品推荐
相关产品推荐

