Python包中引入shell脚本并获取安装后对应包目录的绝对路径
解决方案
方案1:动态查询方案(推荐)
该方案适配所有安装场景(全局安装、虚拟环境安装、可编辑安装),不会因为虚拟环境迁移出现路径失效问题。
步骤1:调整setup.py配置
首先要确保source_dir及其子目录被识别为Python包,且utils下的非代码文件会随包安装到对应路径:
from setuptools import setup, find_packages setup( name="你的包名", version="1.0", # 自动识别所有Python包 packages=find_packages(), # 声明utils目录下的所有文件为包数据,安装时会复制到site-packages对应目录 package_data={ "source_dir.utils": ["*"] }, scripts=['source_dir/utils/mybashscript'], )
注意:需要在
source_dir、source_dir/utils目录下各添加一个空的__init__.py文件,确保这两个目录被识别为可导入的Python包。
步骤2:修改mybashscript获取路径
在shell脚本开头添加以下代码,动态调用Python接口查询utils目录的绝对路径:
#!/bin/bash # 动态获取安装后source_dir/utils的绝对路径 UTILS_DIR=$(python3 -c "import pkg_resources; print(pkg_resources.resource_filename('source_dir.utils', ''))") # 后续可直接使用$UTILS_DIR访问该目录下的任意文件 echo "utils目录绝对路径:$UTILS_DIR"
如果使用Python 3.9及以上版本,也可以用标准库importlib.resources替代pkg_resources,不需要额外依赖setuptools,对应代码为:UTILS_DIR=$(python3 -c "import importlib.resources; print(str(importlib.resources.files('source_dir.utils')))")
方案2:安装时静态写入路径(不推荐)
如果不想在运行时调用Python,也可以通过自定义setup.py的安装命令,在安装阶段把实际路径直接替换到shell脚本的占位符中。但该方案存在缺陷:如果后续移动虚拟环境目录,写入的路径就会失效,兼容性远低于动态查询方案。
内容的提问来源于stack exchange,提问作者fteufel
相关产品推荐
相关产品推荐

