解决conda改uv的python版本更换问题

造相-Z-Image-Turbo 亚洲美女LoRA

造相-Z-Image-Turbo 亚洲美女LoRA

图片生成
Conda
Cuda

基于 **Z-Image-Turbo** 的图片生成 Web 服务,新增对 LoRA laonansheng/Asian-beauty-Z-Image-Turbo-Tongyi-MAI-v1.0 的按需加载支持与严格的后端内容策略

问题


一开始觉得conda的太难使用了,solving environment消耗了非常多的时间,于是开始采用pip + python + 环境变量管理这个原生方案。但是每次切换python版本都会频繁修改python环境变量,把3.13变成3.12,或者反正。忍无可忍。在这个过程中也涌现了很多灵异事件:

  1. 我为了禁止自动启动conda,按照网上的做法修改设置了:conda config --set auto_activate_base false ,但是每次启动终端的时候还会跳出
Traceback (most recent call last): 
File "C:\ProgramData\anaconda3\Scripts\conda-script.py", line 11, in <module> from conda.cli import main 
ModuleNotFoundError: No module named 'conda'

这个提示信息,很难受

  1. 我明明设置PYTHON_HOME为python 3.13了,并且手动刷新过环境变量了(自行bing在powershell中手动刷新环境变量的指令)但是通过utools或者pycharm内置terminal打开的时候,总是pip show pip报错,说:
assert _sre.MAGIC == MAGIC, 
"SRE module mismatch" AssertionError: SRE module mismatch

这类编译版本和运行版本不一致问题。但是有时候我自己在windows的集成终端中通过新建选项卡打开的,则可能不会报这个错误。或者通过
C:/xx/xx/xx/Python/Python313/python.exe -m pip show pip以及C:/xx/xx/xx/Python/Python312/python.exe -m pip show pip都不报错,说明里面已经下载的site-packages结构没问题,不是内部包的冲突问题!

通过新建选项卡的方式运行pip show pip是有效的

问题的恶化


我于是尝试了

  • 重新配置conda的环境变量,优先级比自定义的python高
    此时utools、pycharm内置启动的命令行来运行pip show pip没用报错(并且pycharm内置的包管理器也失效);
    但是终端中通过新建选项卡打开的并且手动刷新过环境变量之后的有效。

  • 彻底卸载conda,删除conda相关的环境变量
    PowerShell启动的时候

Traceback (most recent call last): 
File "C:\ProgramData\anaconda3\Scripts\conda-script.py", line 11, in <module> from conda.cli import main 
ModuleNotFoundError: No module named 'conda'

提示信息还在,没用;utools、pycharm内置启动的命令行来运行pip show pip仍然报错

  • 删除所有PYTHONHOMEPath里面与自定义python路径相关的环境变量
    没用,上述问题仍然存在。只是进一步恶化,使用
Get-Command python #查看python命令详情(包括路径名称)
Write-Output (Get-Command python).Source # 仅查看命令路径

看到的python.exe更加恶化,变成了WindowsApp中(windows应用商店里下载的)python.exe目录了,那个python连site-packages的包都没有

  • 恢复所有PYTHONHOMEPath里面与自定义python路径相关的环境变量

  • 强行安装了uv,uv init项目,然后uv add matplotlib
    报错:

C:/Users/25646/AppData/Local/Programs/Python/Python313/python.exe C:/Users/25646/AppData/Local/Programs/PyCharm Professional/plugins/python-ce/helpers/packaging_tool.py install notebook 输出: 错误: Traceback (most recent call last): File "C:\Users\25646\AppData\Local\Programs\PyCharm Professional\plugins\python-ce\helpers\packaging_tool.py", line 2, in <module> import traceback File "C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\traceback.py", line 5, in <module> import linecache File "C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\linecache.py", line 11, in <module> import tokenize File "C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\tokenize.py", line 33, in <module> import re File "C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\re_init_.py", line 125, in <module> from . import _compiler, _parser File "C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\re_compiler.py", line 18, in <module> assert _sre.MAGIC == MAGIC, "SRE module mismatch" AssertionError: SRE module mismatch

运行不了一点,仍然始终指向Python312\Lib\目录,反复刷新环境变量也没用!

  • 一怒之下将Python312文件夹重命名为Python3912(防止查找环境变量的时候又按照名称先后查找到python312的exe)
    此时在uv环境中运行uv add matplotlib报错:
Using Python 3.13.5 environment at: C:\Users\25646\AppData\Local\Programs\Python\Python313 x 
Failed to build simplewebsocketserver==0.1.2 |-> The build backend returned an error -> Call to setuptools.build_meta:__legacy__.build_wheel failed (exit code: 1) [stderr] 

Fatal Python error: Failed to import encodings module Python runtime state: core initialized ModuleNotFoundError: 

No module named 'encodings' Current thread 0x00009eb0 (most recent call first): <no Python frame> 

hint: This error likely indicates that simplewebsocketserver@0.1.2 depends on encodings, but doesn't declare it as a build dependency. I

f simplewebsocketserver is a first-party package, consider adding encodings to its build-system.requires. Otherwise, either add it to your pyproject.toml under: [tool.uv.extra-build-dependencies] simplewebsocketserver = ["encodings"] or uv pip install encodings into the environment and re-run with --no-build-isolation.

非常有误导性的要求你进一步安装encodings库(实际上是python标准库)

PS: 笔者经常一个月不重启电脑

解决问题的原理与工具


PowerShell运行机制

powershell初始化时会执行profile.ps1文件。你可以通过

notepad $PROFILE

来打开编辑。

同时注意应当取消勾选
在这里插入图片描述
这也是为什么通过utools、pycharm等进程启动的终端和自己新建标签页打开的终端行为有所不同的原因之一。

PS: cmd也有类似的初始化机制,在注册表中,自行bing搜索一下。这也正是后来conda卸载的时候没有处理好这个注册表项,导致我的clink初始化用不了😒😒😒

conda的运行机制

首先需要理解命令行的工作方式,是通过设置Path环境变量来在对应的目录顺次查找。比如设置conda的环境变量添加到

D:\Anaconda3\
D:\Anaconda3\Scripts
D:\Anaconda3\Library\bin

但是采用

$env:PATH -split ';'

查看得到的环境变量的第一位却是:D:\Anaconda3\condabin

所以真实的conda实际上做了这些事情:

首先你需要运行conda init,否则根本无法运行conda activate(只可以运行conda --version);运行conda init的时候conda做了几件事情:把所有powershell.exe对应的profile.ps1文件,插入了下面这三行:

#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
If (Test-Path "C:\ProgramData\anaconda3\Scripts\conda.exe") {
    (& "C:\ProgramData\anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}
#endregion

然后conda实际上做的事情就是

  • 把conda的命令转发用_conda.exe处理
  • 同时运行conda.bat之类的,在当前环境变量首行插入D:\Anaconda3\condabin,使得不管怎么样,运行都是从D:\Anaconda3\condabin真正开始的,使用的python都会是Anaconda3下面的python

所以得到了第一个问题的解答:


⭐Q: 为什么已经设置了
conda config --set auto_activate_base false ,但是每次启动终端的时候还会跳出报错?

Traceback (most recent call last): 
File "C:\ProgramData\anaconda3\Scripts\conda-script.py", line 11, in <module> from conda.cli import main 
ModuleNotFoundError: No module named 'conda'

A:你的profile.ps1中还残留着对应conda的初始化代码:

#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
If (Test-Path "C:\ProgramData\anaconda3\Scripts\conda.exe") {
    (& "C:\ProgramData\anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}
#endregion

自然无论何时何地仍然会执行一遍conda-script.py,但是在pycharm里面打开的时候可能自动加载了.venv等,将当前目录的python插入到环境变量的第一行,使得当前环境找不到conda,也就无法把conda识别为一个“包”。conda-script.py只能由Anaconda3目录下面自己的python运行。

S 解决办法:注释/删除掉profile.ps1中对应的几行(但是这样就没办法用conda了),或者你忍一下,这个是无法解决的。


环境变量的初始化机制(罪大恶极)

  1. Path变量不会自动刷新,需要人手工刷新。附上刷新代码:
# 刷新环境变量
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine) + ";" + [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::User)
# 查看环境变量
$env:PATH -split ';'

然后可以重启powershell一下试试。
尤其是utools、pycharm等由进程级别启动的,更是不一定有刷新,需要人工手动刷新,比较顽固

  1. PYTHON_HOME这类自己新建键值的环境变量,是无法手动重置/覆盖,必须重启刷新的!否则所有由pycharm这类进程级别启动的powershell里面的这个环境变量值仍保留不变!每次启动都是原来的值!

这也就解释了第二个问题(也是首要的,最大的问题)


⭐Q:为什么前面总是各种奇奇怪怪的与python312目录下面的包冲突

"C:\Users\25646\AppData\Local\Programs\Python\Python312\Lib\re_compiler.py", line 18, in <module> assert _sre.MAGIC == MAGIC, "SRE module mismatch"
 AssertionError: SRE module mismatch

的报错?

A:我之前为了自行用pip管理包,设置过了PYTHON_HOME为Python312对应的目录,之后因为各种原因把PYTHON_HOME环境变量删除了或者重置了,但是没有重启过一次电脑,导致pycharm进程级别启动的环境变量中PYTHON_HOME始终指向Python312的包,即使切换到python313版本之后亦如此,于是产生了严重的包冲突!

Path中的python已经刷新改为了python313但是包目录(PYTHON_HOME)仍然是python312的,pip installpip show pip自然一直报错

实际上一直到后来的uv进行uv pip install的时候,仍然是错误的包目录,一直报错。后来我恰好把Python312文件夹重命名了,此时PYTHON_HOME不变,这下干脆变成连python标准库里面的包都找不到了,报了No module named 'encodings' Current thread 0x00009eb0 (most recent call first): <no Python frame> 错误

S 解决办法:删除PYTHON_HOME变量(因为使用uv或者conda管理多版本都不需要这个变量,这个变量的存在反而会导致包目录指向不正确,产生严重的后果),然后重启电脑


⭐Q:为什么pycharm内启动的进程级终端和自己打开的终端行为不同?
A:原因可能是如下几点,按照不同的方法排查:

  1. ExecutionPolicy不同。
    查看方式:powershell输入:Get-ExecutionPolicy -List,查看当前的策略。对于Process级别的,这样调整:Set-ExecutionPolicy RemoteSigned -Scope Process(策略名是什么意思参考powershell 脚本运行 - 博客园
  2. 见上,在集成终端的设置->默认值->启动目录->取消勾选“使用父进程目录”,确保环境一致
  3. 环境变量没有刷新。
    采用如下方式对照
# 查看环境变量
$env:PATH -split ';'
Get-Command python #查看python命令详情(包括路径名称)
Write-Output (Get-Command python).Source # 仅查看命令路径
echo $ENV:PYTHONHOME
echo $ENV:PYTHON_HOME
echo $ENV:PYTHONPATH

分别在两个终端中运行,对比哪个不同。可能出现的不同有:

  • Pycharm自动激活了virtuenv,并且.venv目录插入到当前终端的环境变量Path之首
  • 环境变量不同,内置process级别打开的终端没有自动刷新环境Path变量
  • PYTHONHOME等自定义Key-Value的变量,没有经过重启的情况下不自动刷新,仍然使用残留值

手工刷新Path环境变量则采用上面讲的手工刷新环境变量的代码;其余的变量刷新需要重启。

conda改uv注意事项

1. pip包管理

不推荐使用pip install或者C:/xx/xx/xx/python.exe -m pip install这种方式,全部改用

uv pip install matplotlib --python 3.13 --system

的方式。各个参数的含义参见uv官方文档

至于uv tool install命令是需要有exe文件的包,相当于安装了一个指令。具体可以参见uv的官方文档

2. python版本管理

可以采用pyenv,但是无法指定安装目录。使用了uv的话,全局python就不是这么重要了。

最后:uv就是快,不会卡在solving environment!

您可能感兴趣的与本文相关的镜像

造相-Z-Image-Turbo 亚洲美女LoRA

造相-Z-Image-Turbo 亚洲美女LoRA

图片生成
Conda
Cuda

基于 **Z-Image-Turbo** 的图片生成 Web 服务,新增对 LoRA laonansheng/Asian-beauty-Z-Image-Turbo-Tongyi-MAI-v1.0 的按需加载支持与严格的后端内容策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值