这是一个PowerShell执行策略的问题。当你在Windows上运行PowerShell脚本时,可能会遇到数字签名错误。以下是几种解决方法:
方法1:以管理员身份运行PowerShell并更改执行策略
# 以管理员身份打开PowerShell,然后执行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 或者更宽松的策略:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
方法2:临时绕过执行策略
# 在每次运行脚本时使用:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
.\.venv\Scripts\Activate.ps1
或者一行命令:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process; .\.venv\Scripts\Activate.ps1
方法3:使用命令提示符(CMD)替代
# 直接使用CMD激活虚拟环境
.venv\Scripts\activate.bat
方法4:为单个脚本解除限制
# 右键点击Activate.ps1文件 → 属性 → 勾选"解除锁定" → 确定
方法5:使用数字签名(高级)
如果你有代码签名证书:
Set-AuthenticodeSignature -FilePath .\.venv\Scripts\Activate.ps1 -Certificate <你的证书>
推荐的永久解决方案
对于开发环境,建议使用方法1:
# 以管理员身份打开PowerShell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
这样设置后,以后就可以正常激活虚拟环境了:
.\.venv\Scripts\Activate.ps1
执行策略说明
- Restricted:默认策略,不允许运行任何脚本
- RemoteSigned:可以运行本地脚本,远程脚本需要数字签名(推荐)
- Unrestricted:允许运行所有脚本
- Bypass:绕过所有安全限制
检查当前执行策略
Get-ExecutionPolicy -List
如果以上方法都不行,可以使用替代方案:
# 直接在Python中设置虚拟环境路径
import sys
import os
venv_path = ".venv"
if os.path.exists(venv_path):
if sys.platform == "win32":
scripts_path = os.path.join(venv_path, "Scripts")
else:
scripts_path = os.path.join(venv_path, "bin")
# 将虚拟环境的Python添加到路径
sys.path.insert(0, os.path.join(venv_path, "Lib", "site-packages"))
os.environ["PATH"] = scripts_path + os.pathsep + os.environ["PATH"]
建议优先使用方法3(使用CMD)或方法1(修改执行策略),这是最常见且安全的解决方案。