无法向Python虚拟环境加载同名只读环境变量问题排查
问题原因拆解
写入.env时为啥没报错?
你在setup_submodule里只是把只读变量PROJECT_PATH的值读出来,当成字符串写到.env文件里而已——这个过程根本没碰脚本里那个标记为readonly的变量本身,只是拿它的值用,自然不会触发只读限制。加载.env时为啥炸了?
当你把source $env_path加到虚拟环境的activate脚本后,以后只要在当前bash进程里执行source activate,就会在当前进程里跑.env里的export PROJECT_PATH=xxx。但当前进程里已经有个被标记为readonly的PROJECT_PATH了,bash绝对不允许给只读变量重新赋值(哪怕是用export再声明一遍也不行),直接就报错了。
可行解决办法
改.env里的变量名(最稳妥)
这是你已经试过有效的方法,把.env里的PROJECT_PATH换成别的名字(比如PROJECT_DIR),彻底避开和脚本里只读变量的冲突。用子shell隔离环境(按需选择)
如果一定要保留同名变量,可以把source .env的操作放到子shell里,这样变量只会在子shell里生效,不会影响当前进程的只读变量,但这种方式可能不满足你需要在当前环境用这个变量的需求:# 替换原有的echo语句 echo "(source $env_path)" >> "${PYTHON_VENV}/bin/activate"临时取消只读属性(不推荐)
可以用declare +r PROJECT_PATH取消变量的只读标记,但这个操作会破坏脚本原本的只读约束,有风险,只适合应急:echo "declare +r PROJECT_PATH 2>/dev/null; source $env_path" >> "${PYTHON_VENV}/bin/activate"
内容的提问来源于stack exchange,提问作者Gonzalo Etse
相关产品推荐
相关产品推荐

