如何在Makefile中为Python脚本临时添加模块搜索路径
Makefile临时添加Python依赖路径方案
原配置失效原因
Makefile的每条命令默认运行在独立的子shell中,原配置里单独一行的export PYTHONPATH仅对当前行的子shell生效,执行下一行python命令时环境变量已丢失,因此触发模块导入错误。
可直接复用的配置
直接在python命令前临时注入PYTHONPATH,变量仅对当前python进程生效,不会污染全局环境,且通过Makefile内置变量自动获取项目根的绝对路径,本地、Docker挂载场景都能兼容:
THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) .PHONY: default analyse analyse: PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py
注意:Makefile命令行前的缩进必须使用Tab字符,不能用空格替代。
如果同一个目标下有多条命令需要用到该路径,可以用反斜杠换行、分号连接命令,保证所有命令在同一个子shell中执行:
analyse: export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools; \ python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py
sys.path.append导致IDE无法跳转的解决方案
不推荐在业务代码中硬编码sys.path.append拼接路径,采用运行配置和IDE静态配置分离的方案即可同时解决运行导入和IDE跳转问题:
- 运行时的路径依赖完全通过上述Makefile临时注入PYTHONPATH实现,Python代码中直接写标准导入语句
from fileOp import FileOp即可,不需要额外加路径处理逻辑 - 针对IDE做单独的路径配置,让静态解析功能识别到
tools目录:- PyCharm环境:右键点击
tools文件夹,选择「Mark Directory as」→「Sources Root」,IDE会自动将该目录加入模块搜索路径,代码补全、定义跳转可正常使用 - VS Code环境:在项目根目录创建
.vscode/settings.json文件,添加如下配置,将tools目录加入Python分析的额外搜索路径:
{ "python.analysis.extraPaths": [ "./tools" ] } - PyCharm环境:右键点击
该方案不需要写绝对路径,不需要永久修改系统PYTHONPATH,同时兼容多环境运行,也不会影响IDE的代码分析功能。
内容的提问来源于stack exchange,提问作者Gerrie
相关产品推荐
相关产品推荐

