Windows 10下使用virtualenv-clone跨机克隆Python虚拟环境报错如何排查解决
Windows下Python虚拟环境迁移的报错与解决
问题场景
- 运行系统:Windows 10
- 已测试的Python版本:3.9.0、3.9.2
- 核心需求:将本地创建的Python虚拟环境克隆到另一台Windows 10设备上
- 前期无效尝试:直接复制粘贴虚拟环境文件夹,该方案无法正常生效
- 选用工具:
virtualenv-clone
执行的命令如下:
virtualenv-clone myVenv myVenv_clone
命令执行后收到的完整报错栈为:
File "c:\users\freddy\appdata\local\programs\python\python39\lib\site-packages\clonevirtualenv.py", line 55, in _virtualenv_sys p = subprocess.Popen([executable, File "c:\users\freddy\appdata\local\programs\python\python39\lib\subprocess.py", line 947, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "c:\users\freddy\appdata\local\programs\python\python39\lib\subprocess.py", line 1416, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, OSError: [WinError 87] The parameter is incorrect
查阅过该报错的多种诱因解释,部分说法提到报错和Python版本相关,但本人不清楚后续该如何排查解决。
补充测试过程
- 结合版本适配的猜测,首先测试Python 3.8.9,仍然出现相同的WinError 87报错。
- 进一步核查发现,
virtualenv-clone的最后一次更新时间,是在Python 3.8.2版本发布之后,于是测试Python 3.8.2,此时出现了新的报错:
Fatal Python error: _Py_HashRandomization_Init: failed to get random numbers to initialize Python
- 在Python 3.8.1、3.8.0、3.7.9、3.7.6版本下测试,同样会出现上述随机数初始化失败的报错,看起来Python无法访问生成随机数所需的系统资源。
- 部分零散的公开信息提到,该问题可能和Python无法识别
%systemroot%环境变量有关,但本人不清楚该如何修复这个问题。 - 为简化测试流程,全程采用虚拟机快照模式开展测试:在Windows 10系统中仅安装单个Python版本,执行测试报错后,将系统恢复到安装Python之前的状态,再切换其他Python版本进行验证,排除多版本共存带来的环境干扰。
问题根因
- WinError 87报错的核心原因是
virtualenv-clone工具已停止维护,最后一次更新停留在2020年。其在Windows下组装子进程启动参数的逻辑,不符合新版Windows对CreateProcess函数的参数校验规则,当搭配3.7以上版本的Python使用时,就会触发参数非法的报错。 - 随机数初始化失败的报错,是因为工具在克隆虚拟环境时,会重写虚拟环境内的Python可执行文件关联路径,但写入时丢失了路径的引号包裹,导致Python进程启动时无法定位到正确的系统随机数资源,触发初始化流程失败。
高可靠迁移方案(无额外工具依赖)
这个方案是Python官方推荐的虚拟环境迁移方式,兼容性远好于停止维护的克隆工具:
- 在源设备上激活原有虚拟环境,导出完整依赖列表:
注意:如果环境中包含本地wheel安装、git源安装的特殊依赖,需要单独记录这部分依赖的安装命令,避免导出的列表无法完全复现。pip freeze > requirements.txt - 仅将
requirements.txt文件拷贝到目标设备,不需要传输整个虚拟环境文件夹。 - 在目标设备上安装和源设备完全一致版本的Python解释器,注意32/64位、小版本号必须严格匹配,避免二进制依赖的兼容问题。
- 在目标设备上创建全新的虚拟环境,激活后通过依赖列表恢复环境:
pip install -r requirements.txt
若坚持使用virtualenv-clone的临时修复方案
- 先验证系统环境变量
%systemroot%的配置正确性:按下Win+R输入sysdm.cpl,打开系统属性-高级-环境变量,在系统变量中找到SystemRoot,确认其值为C:\Windows,如果值异常,修改为正确值后重启系统再测试。 - 安装最新版本的依赖包,避免使用旧版本:
pip install --upgrade virtualenv virtualenv-clone - 注意:由于工具本身已停止维护,该临时修复方法仅在特定版本组合下生效,遇到新Python版本适配问题的概率很高,优先推荐使用上述导出依赖重建环境的方案。
内容的提问来源于stack exchange,提问作者iAwardYouNoPoints
相关产品推荐
相关产品推荐

