You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows环境下Jupyter Notebook及VSCode虚拟环境中GLPK求解器无法被Pyomo识别的问题咨询

Windows环境下Jupyter Notebook及VSCode虚拟环境中GLPK求解器无法被Pyomo识别的问题咨询

我的环境和遇到的问题

我目前在用Windows 10系统,VS Code版本是1.94.2,用venv创建了一个基于Python 3.13.0的虚拟环境。之前已经下载了GLPK,把它放在C:\glpk-4.65\w64路径下,并且添加到了系统环境变量PATH里——在VS Code之外的cmd里执行echo %path%,能看到这个路径确实在列表里。

但现在遇到两个麻烦:

  1. 打开VS Code的终端,激活虚拟环境后,输入glpsol --help居然提示命令不被识别,这到底是为啥啊?
  2. 后来我在虚拟环境的终端里手动执行了set PATH=%PATH%;C:\glpk-4.65\w64,这下glpsol --help能正常运行了。可我安装Pyomo后写了一段代码,运行的时候发现Pyomo还是找不到GLPK求解器,我的代码片段是这样的:
import pandas as pd
import pyomo.environ as pyo
import matplotlib.pyplot as plt

model = pyo.ConcreteModel()
model.x = pyo.Var([1,2], domain=pyo.NonNegativeReals)
model.OBJ = pyo.Objective(expr = 2*model.x[1] + 3*model.x[2])
# 后面还有约束条件和求解的代码,但运行时提示找不到求解器

问题分析和解决建议

先解答你的第一个疑问:为啥VS Code虚拟环境终端识别不了GLPK?

这其实是Windows环境下常见的小坑:

  • 如果你是先启动了VS Code,再去系统里添加的GLPK环境变量,那VS Code的终端会话是不会自动刷新环境变量的,它只会在启动时读取一次系统的环境变量,所以新添加的路径不会被加载进来。
  • 另外,虚拟环境的激活脚本(比如activate.bat)在激活时,可能会对PATH变量做调整,比如把虚拟环境的Scripts目录放到最前面,有时候会导致系统级的路径被“挤”掉,或者没有正确继承。

针对问题的具体解决办法

给你几个实用的方案,按优先级排序:

  1. 最简单的:重启VS Code
    如果你是在VS Code启动后才配置的系统PATH,直接关掉VS Code再重新打开,激活虚拟环境后再试glpsol --help,大概率就能直接识别了——因为重启后VS Code会重新读取最新的系统环境变量。

  2. 一劳永逸:给虚拟环境自动加路径
    找到你的虚拟环境目录,进入里面的Scripts文件夹(比如./venv/Scripts),编辑里面的activate.bat文件(如果没有就新建一个),在文件末尾加这么一行:

    set PATH=%PATH%;C:\glpk-4.65\w64
    

    这样以后每次激活这个虚拟环境,GLPK的路径都会自动被加到PATH里,不用每次手动输入命令了。

  3. 直接在Pyomo里指定求解器路径
    要是不想折腾环境变量,也可以在代码里直接告诉Pyomo求解器的位置,这样不管PATH里有没有,它都能找到:

    # 创建求解器的时候直接指定可执行文件路径
    solver = pyo.SolverFactory('glpk', executable=r'C:\glpk-4.65\w64\glpsol.exe')
    # 然后正常求解
    result = solver.solve(model)
    # 可以打印求解结果看看
    print(result)
    model.display()
    

    这里路径用了原始字符串(前面加r),避免转义字符的问题,也可以用双反斜杠\\代替。

  4. 检查虚拟环境的激活脚本
    要是上面的方法都不管用,你可以打开虚拟环境Scripts文件夹里的activate.bat,看看里面有没有修改PATH的语句,比如有没有把系统PATH覆盖掉的情况,确保GLPK的路径被包含在最终的PATH里。


备注:内容来源于stack exchange,提问作者mlamlamla

火山引擎 最新活动