0

当用户单击按钮时,我想从 Qt 运行 python 脚本。该脚本在终端中正常工作,但从 Qt 执行时出现错误。

我试图从 Pycharm IDE 执行脚本,我得到了同样的错误:

Traceback (most recent call last):
  File "/home/ana/PycharmProjects/Gurobi/one_set.py", line 1, in <module>
   from gurobipy import *
  File "/usr/local/lib/python2.7/dist-packages/gurobipy/__init__.py", line 1, in <module>
    from .gurobipy import *
ImportError: libgurobi81.so: cannot open shared object file: No such file or directory

当我在 python 控制台中执行“import gurobipy”时,我没有收到任何错误。

导入 gurobipy

导入 pkg_resources

pkg_resources.get_distribution("gurobipy").version

'8.1.1'

搜索 libgurobi81.so,我检查该文件是否存在于:

/opt/gurobi811/linux64/lib/libgurobi81.so

/usr/lib/python2.7/dist-packages/gurobi811/linux64/lib/libgurobi81.so

/usr/local/lib/python2.7/dist-packages/gurobipy/libgurobi81.so

正如安装说明中所建议的,我在 /home/usr/.bashrc 中包含了环境变量:

export GUROBI_HOME="/opt/gurobi811/linux64"

export PATH="${PATH}:${GUROBI_HOME}/bin"

export LD_LIBRARY_PATH="${GUROBI_HOME}/lib"

我还包括了包含 libgurobi81.so 的其他目录:

export PATH=$PATH:/usr/lib/python2.7/dist-packages/gurobi811/

export PATH=$PATH:/usr/local/lib/python2.7/dist-packages/gurobipy/

但是,从终端一切正常,我得到了解决方案:

/usr/bin/python2.7 /home/ana/PycharmProjects/Gurobi/one_set.py

学术许可 - 仅用于非商业用途

 instance     objVal          time

Instance1.csv    0.030176      0.0002670288

 [1 rows x 2 columns]

我用来从 Qt 运行 python 脚本的代码是:

   QString  command("/usr/bin/python2.7");
   QStringList params = QStringList() << "/home/ana/PycharmProjects/Gurobi/one_set.py";

   QProcess *process = new QProcess();
   process->startDetached(command, params);
   process->waitForFinished();
   qDebug()<<process->readAllStandardOutput();
   process->close();

我希望 Qt 的输出与终端的输出相同,因为我用来运行它的命令是相同的:/usr/bin/python2.7 /home/ana/PycharmProjects/Gurobi/one_set.py

4

1 回答 1

0

解决了。解决方案是在进程开始之前添加环境变量:

   QString  command("/usr/bin/python2.7");
   QStringList params = QStringList();
   params.append("/home/ana/PycharmProjects/Gurobi/one_set.py");


   QProcess *process = new QProcess();
   QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
   env.insert("LD_LIBRARY_PATH", "/usr/local/lib:/opt/gurobi811/linux64/lib:/opt/gurobi811/linux64/lib:/opt/gurobi811/linux64/lib/"); // Add an environment variable
   process->setProcessEnvironment(env);


   process->start(command, params);
   process->waitForFinished();
   QString p_stdout = process->readAllStandardOutput();
   ui->Output->setText(p_stdout);
   process->close();
于 2019-10-30T10:58:29.963 回答