能否通过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
相关产品推荐
相关产品推荐

