python - 如何为 python 3.6 安装 lpsolve?

标签 python c compiler-errors compilation

因此,我正在使用 python 3.6 运行时创建一个 Docker 容器。我需要用于 python 的 UX64 版本的 lp_solver ( http://lpsolve.sourceforge.net/5.5/index.htm )。链接的是python 2.7。我发现了以下内容:https://github.com/chandu-atina/lp_solve_python_3x但它也不起作用。尝试了两种方法。我真的不知道如何让这个 lp_solver 在 Ubuntu Python 3.6 上工作。是否有类似以下内容:https://www.lfd.uci.edu/~gohlke/pythonlibs/#lp_solve但是对于 Ubuntu?

还发现了这个,它起作用了:https://anaconda.org/snorfalorpagus/lpsolve 但我无法导入 lpsolve。 (这里是导入 lpsolve 的链接问题:Conda installation of lpsolve)

编辑 1:

以下是我采取的步骤:

mkdir -p /tmp/lp_solve && cd /tmp/lp_solve

wget -O ./lp_solve.tar.gz http://sourceforge.net/projects/lpsolve/files/lpsolve/5.5.2.0/lp_solve_5.5.2.0_source.tar.gz/download

tar -xf lp_solve.tar.gz

DOWNLOAD THE REPO FROM GITHUB  (https://github.com/chandu-atina/lp_solve_python_3x )

mkdir -p /tmp/lp_solve/lp_solve_5.5/extra/

//创建Python目录!只要确保 origin 是 extra/Python

cp -R extra/Python_that_is_downloaded  /tmp/lp_solve/lp_solve_5.5/extra/ 

cd /tmp/lp_solve/lp_solve_5.5/lpsolve55

chmod a+x ccc

sh ccc

sh ccc 上,我在 .h 文件中遇到大量语法错误。 这里:

user@user-box:/tmp/lp_solve/lp_solve_5.5/lpsolve55$ sh ccc
/tmp/platform.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main(){printf("ux%d", (int) (sizeof(void *)*8));}
 ^
In file included from ../lp_MDO.c:22:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_crash.c:21:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_lib.c:41:0:
../lp_lib.h:63:0: warning: "isnan" redefined
 # define isnan(x) FALSE
 ^
In file included from ../lp_lib.c:27:0:
/usr/include/math.h:292:0: note: this is the location of the previous definition
 #  define isnan(x) __builtin_isnan (x)
 ^
In file included from ../lp_wlp.c:6:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_matrix.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_mipbb.c:30:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_MPS.c:5:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_params.c:6:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_presolve.c:36:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_price.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_pricePSE.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_scale.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_simplex.c:27:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_SOS.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_utils.c:4:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
ar: lp_MDO.o: No such file or directory
In file included from ../lp_MDO.c:22:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_crash.c:21:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_lib.c:41:0:
../lp_lib.h:63:0: warning: "isnan" redefined
 # define isnan(x) FALSE
 ^
In file included from ../lp_lib.c:27:0:
/usr/include/math.h:292:0: note: this is the location of the previous definition
 #  define isnan(x) __builtin_isnan (x)
 ^
In file included from ../lp_wlp.c:6:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_matrix.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_mipbb.c:30:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_MPS.c:5:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_params.c:6:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_presolve.c:36:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_price.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_pricePSE.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_scale.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_simplex.c:27:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_SOS.c:3:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
In file included from ../lp_utils.c:4:0:
../shared/commonlib.h:88:24: error: expected identifier or ‘(’ before numeric constant
   #define FALSE        0
                        ^
cc: error: lp_MDO.o: No such file or directory
cc: error: lp_crash.o: No such file or directory
cc: error: lp_wlp.o: No such file or directory
cc: error: lp_matrix.o: No such file or directory
cc: error: lp_mipbb.o: No such file or directory
cc: error: lp_MPS.o: No such file or directory
cc: error: lp_params.o: No such file or directory
cc: error: lp_presolve.o: No such file or directory
cc: error: lp_price.o: No such file or directory
cc: error: lp_pricePSE.o: No such file or directory
cc: error: lp_scale.o: No such file or directory
cc: error: lp_simplex.o: No such file or directory
cc: error: lp_SOS.o: No such file or directory
cc: error: lp_utils.o: No such file or directory

对不起,当我在代码中附上代码片段时,它在这里给了我错误。

最佳答案

我如何让 lpsolve 在 raspbian 上与 python 3.5.3 一起工作:

从仓库安装

apt-get install lp-solve # for shared object file (liblpsolve55.so)
apt-get install liblpsolve55-dev # for header files (e.g. lp_lib.h)

从 sourceforge ( https://sourceforge.net/projects/lpsolve/files/lpsolve/5.5.2.5/lp_solve_5.5.2.5_Python_source.tar.gz/download ) 获取 Python 源代码。

解压tar文件

tar -xzf lp_solve_5.5.2.5_Python_source.tar.gz
cd lp_solve_5.5/extra/Python

运行开始安装

bash build.sh

在我的案例中,源文件有一些与 python3 无关的问题。

  1. lp_lib.h 无法找到。通过将 '/usr/include/lpsolve' 添加到 setup.py 中的 include_dirs 解决
  2. hash.c 中定义的函数的多个定义错误。通过从要在 setup.py 中编译和链接的文件中删除“hash.c”文件来解决。
  3. 未定义的引用符号。通过将“colamd”添加到 setup.py 中的库解决

Python3 相关问题:

  1. print ... 已更改为 print(...)。在 setup.py 中更新
  2. PyString 已更改为 PyUnicode/PyBytes,PyInt 已更改为 PyLong (https://docs.python.org/3/howto/cporting.html)。在 pythonmod.c 中更新
  3. Init 模块功能已更改(https://docs.python.org/2.3/whatsnew/node20.htmlDifference between PyMODINIT_FUNC and PyModule_Createhttps://docs.python.org/3/c-api/module.html)。在 pythonmod.c 中更新

setup.py 差异

14c14
< print 'numpy: ' + NUMPY
---
> print('numpy: ' + NUMPY)
30c30
<               ["lpsolve.c", "hash.c", "pythonmod.c"],
---
>               ["lpsolve.c", "pythonmod.c"],
32c32
<                                 include_dirs=['../..', NUMPYPATH],
---
>                                 include_dirs=['../..', NUMPYPATH, '/usr/include/lpsolve'],
34c34
<               libraries = ["lpsolve55"])
---
>               libraries = ["lpsolve55", "colamd"])

pythonmod.c 比较

35a36
> static char lpsolve_name[] = "lpsolve";
43a45,48
> static PyModuleDef lpsolve_module = { .m_base = PyModuleDef_HEAD_INIT,
> .m_name = lpsolve_name,
> .m_doc = lpsolve_doc,
> .m_methods = lpsolve_methods };
47,48c52,53
< DL_EXPORT(void)
<     initlpsolve55(void)
---
> PyMODINIT_FUNC
> PyInit_lpsolve55(void)
53c58
<     m = Py_InitModule("lpsolve55", lpsolve_methods);
---
>     m = PyModule_Create(&lpsolve_module);
85,212c90,217
<     PyDict_SetItemString(d, "LE", PyInt_FromLong(LE));
...
<     PyDict_SetItemString(d, "FULL", PyInt_FromLong(FULL));
---
>     PyDict_SetItemString(d, "LE", PyLong_FromLong(LE));
...
>     PyDict_SetItemString(d, "FULL", PyLong_FromLong(FULL));
213a219,220
> 
>     return m;
771c778
<            (PyString_AsStringAndSize(item, &ptr, &size1) != 0) ||
---
>            (PyBytes_AsStringAndSize(item, &ptr, &size1) != 0) ||
799c806
<         if (PyString_Check(vector)) {
---
>         if (PyUnicode_Check(vector)) {
824c831
<           if ((item == NULL) || (!PyString_Check(item))) {
---
>           if ((item == NULL) || (!PyUnicode_Check(item))) {
832c839
<               if ((PyString_AsStringAndSize(item, &ptr, &size1) != 0) ||
---
>               if ((PyBytes_AsStringAndSize(item, &ptr, &size1) != 0) ||
1028c1035
<                 setlhs(lpsolvecaller, element, PyString_FromString(*str));
---
>                 setlhs(lpsolvecaller, element, PyUnicode_FromString(*str));
1035c1042
<                   MyPyArray_SET_ITEM(PyObject1, i, PyString_FromString(*(str++)));
---
>                   MyPyArray_SET_ITEM(PyObject1, i, PyUnicode_FromString(*(str++)));

验证安装是否按照 lpsolve ( http://lpsolve.sourceforge.net/5.5/Python.htm#Installation ) 文档中的指示工作

>>> from lpsolve55 import *
>>> lpsolve()

关于python - 如何为 python 3.6 安装 lpsolve?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48765299/

相关文章:

c - 字符串比较在 C 中不起作用

android - “R”或“Resource”在Android Studio中给我错误

c++ - 在 Visual Studio 2013 for C++ 中调试时的错误代码

python - 绘制热图时对数据进行排序

python - Pyspark 数据帧操作的单元测试用例

python - 应用引擎 : submitting form data to Google Spreadsheet

python - Python 如何在没有 %s 的情况下进行字符串替换?

c - 为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

C++ header guards 不会编译

c# - 什么是 C fread() 的 C# 模拟?