基于pyproject.toml setuptools实现二进制文件动态定位同目录配置文件
解决Python项目二进制文件动态定位同目录配置文件的问题
核心思路
运行二进制文件时,当前工作目录并非Python脚本所在的site-packages/ranchercli目录,因此相对路径无法定位到配置文件。解决方案是通过代码动态获取脚本所在目录,拼接出配置文件的绝对路径,同时确保安装时配置文件被正确部署到对应位置。
步骤1:修改Python代码,动态生成配置文件路径
在ranchercli.py中,替换原本依赖命令行传入相对路径的逻辑,改为自动获取脚本所在目录并拼接配置文件路径:
import os from pathlib import Path import argparse # 获取当前脚本所在的绝对目录 script_dir = Path(__file__).parent.resolve() # 拼接配置文件的绝对路径 default_project_file = script_dir / "ranchercli-projects.json" # 处理命令行参数,默认使用动态生成的配置文件路径 parser = argparse.ArgumentParser() parser.add_argument("--projectfile", default=str(default_project_file)) parser.add_argument("--ns") parser.add_argument("--env") parser.add_argument("--refresh", action="store_true") args = parser.parse_args() # 检查配置文件是否存在 if not os.path.exists(args.projectfile): raise FileNotFoundError(f"--projectfile={args.projectfile} not found")
这样不管二进制文件在哪个目录运行,都能准确找到同目录下的配置文件。
步骤2:确保配置文件被正确打包安装
在pyproject.toml中配置package-data,让setuptools把配置文件打包到安装目录:
[project] name = "ranchercli" version = "0.1.0" # 其他项目基础配置(如作者、依赖等) [tool.setuptools.package-data] ranchercli = ["ranchercli-projects.json"] [tool.setuptools.packages.find] where = ["."] # 若代码在src目录下则改为["src"],根据实际项目结构调整
验证效果
重新打包并通过pip安装项目后,直接运行ranchercli.exe无需手动指定配置文件路径,代码会自动定位到site-packages/ranchercli/ranchercli-projects.json,在任意目录运行都能正常访问。
内容的提问来源于stack exchange,提问作者MortenB
相关产品推荐
相关产品推荐

