You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过Poetry为Python包添加bash脚本作为控制台入口点?

能否用Poetry将bash脚本设为Python包的控制台入口点?

Poetry和setuptools的console_scripts入口点机制原生不支持直接使用bash脚本,这是设计层面的决策——因为console_scripts本质依赖Python的导入系统加载执行入口逻辑,生成的启动器会尝试导入指定的模块/函数,而非直接执行非Python脚本。

可行解决方案

方案1:用Python包装脚本间接调用bash脚本

写一个简单的Python脚本作为中间入口,在里面调用你的entry.sh:

# entry_wrapper.py(放在你的Python包目录下)
import subprocess
import sys
from pathlib import Path

def main():
    # 定位bash脚本的路径,确保安装后能找到
    script_path = Path(__file__).parent / "entry.sh"
    # 传递命令行参数给bash脚本
    subprocess.run([str(script_path)] + sys.argv[1:], check=True)

if __name__ == "__main__":
    main()

然后在pyproject.toml中配置Poetry的脚本入口:

[tool.poetry.scripts]
entry = "your_package.entry_wrapper:main"

安装包后,执行entry命令就会触发Python脚本,进而调用bash脚本。

方案2:直接用Poetry的scripts配置执行bash脚本

Poetry的scripts字段支持直接配置可执行命令,无需通过Python入口:

[tool.poetry.scripts]
entry = "bash entry.sh"

需要注意:要确保entry.sh被正确打包到安装路径,需在pyproject.toml中添加包含规则:

[tool.poetry]
include = ["entry.sh"]

如果脚本放在包子目录下,调整命令路径为相对位置,比如bash your_package/entry.sh。

为什么原生不支持?

你看到的setuptools生成的importlib_load_entry_point代码已经说明问题:该函数核心是查找并加载Python的entry point对象,要求入口必须是可导入的Python模块或函数,而非任意脚本。Poetry的实现也遵循这一逻辑,仅处理Python文件作为入口点,这是为了保持console_scripts机制与Python生态的一致性。

内容的提问来源于stack exchange,提问作者Most Wanted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:50:30