M1 Mac系统安装CyLP包后出现ImportError该如何修复?
macOS下CyLP包安装运行问题排查记录
初始环境与问题复现
- 操作系统:macOS Big Sur 11.5.1
- 运行环境:Anaconda3,Python 3.8.8
- 目标安装包:CyLP
按照官方指引首先用homebrew安装cbc,首次执行brew install coin-or-tools/coinor/cbc失败,改用brew install cbc完成安装,随后执行pip install cylp安装CyLP本体。
安装显示成功,安装路径为/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp,但在CyLP目录下执行单元测试命令python -m unittest discover时报错,错误信息如下:
ERROR: cy (unittest.loader._FailedTest) ---------------------------------------------------------------------- ImportError: Failed to import test module: cy Traceback (most recent call last): File "/opt/homebrew/anaconda3/lib/python3.8/unittest/loader.py", line 470, in _find_test_path package = self._get_module_from_name(name) File "/opt/homebrew/anaconda3/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name __import__(name) File "/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/__init__.py", line 1, in <module> from .CyCoinIndexedVector import CyCoinIndexedVector ImportError: dlopen(/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so, 2): Symbol not found: __ZN9CoinError12printErrors_E Referenced from: /opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so Expected in: flat namespace in /opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so ====================================================================== ERROR: py (unittest.loader._FailedTest) ---------------------------------------------------------------------- ImportError: Failed to import test module: py Traceback (most recent call last): File "/opt/homebrew/anaconda3/lib/python3.8/unittest/loader.py", line 470, in _find_test_path package = self._get_module_from_name(name) File "/opt/homebrew/anaconda3/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name __import__(name) File "/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/py/__init__.py", line 1, in <module> from . import pivots File "/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/py/pivots/__init__.py", line 3, in <module> from .PositiveEdgePivot import PositiveEdgePivot File "/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/py/pivots/PositiveEdgePivot.py", line 9, in <module> from cylp.cy import CyCoinIndexedVector File "/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/__init__.py", line 1, in <module> from .CyCoinIndexedVector import CyCoinIndexedVector ImportError: dlopen(/opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so, 2): Symbol not found: __ZN9CoinError12printErrors_E Referenced from: /opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so Expected in: flat namespace in /opt/homebrew/anaconda3/lib/python3.8/site-packages/cylp/cy/CyCoinIndexedVector.cpython-38-darwin.so ---------------------------------------------------------------------- Ran 2 tests in 0.000s
2021年9月12日更新
排查有初步进展,homebrew安装cbc存在已知问题,因此改为从源码编译安装CBC及其所有依赖。完成后配置COIN_INSTALL_DIR环境变量指向CBC安装目录,仍无法通过pip install cylp完成安装,报错为x86架构不兼容。
切换至Python 3.9环境,克隆CyLP仓库后使用pip3 install手动安装,安装程序可正常识别系统架构,不再忽略.dylib文件,但出现新的编译错误:
cylp/cpp/ICbcModel.cpp:35:9: error: no matching function for call to 'CbcMain0' CbcMain0(*this); ^~~~~~~~ /Users/usr1/dist/include/coin/CbcSolver.hpp:310:6: note: candidate function not viable: requires 2 arguments, but 1 was provided void CbcMain0(CbcModel &babSolver, CbcSolverUsefulData &solverData); ^ cylp/cpp/ICbcModel.cpp:37:16: error: no matching function for call to 'CbcMain1' return CbcMain1(3, argv, *this); ^~~~~~~~ /Users/usr1/dist/include/coin/CbcSolver.hpp:314:5: note: candidate function not viable: requires 4 arguments, but 3 was provided int CbcMain1(int argc, const char *argv[], CbcModel &babSolver, ^ /Users/usr1/dist/include/coin/CbcSolver.hpp:312:5: note: candidate function not viable: requires 5 arguments, but 3 were provided int CbcMain1(int argc, const char *argv[], CbcModel &babSolver, int(CbcModel *currentSolver, int whereFrom), CbcSolverUsefulData &solverData); ^ 2 errors generated. error: command '/usr/bin/clang' failed with exit code 1 ---------------------------------------- ERROR: Failed building wheel for cylp........
2021年9月12日第二次更新
问题已基本解决。
执行单元测试仍有报错:
m.addConstraint(A * x == b) EEClp6001E Unable to open file /opt/homebrew/lib/python3.9/site-packages/cylp/py/modeling/../../input/p0033.mps for reading Clp3002W Empty problem - 0 rows, 3 columns and 0 elements Clp0000I Optimal - objective value 0 E.Clp6001E Unable to open file /opt/homebrew/lib/python3.9/site-packages/cylp/py/../input/netlib/adlittle.mps for reading zsh: segmentation fault python3 -m unittest discover
上述报错可忽略,分段错误原因是CyLP的GitHub仓库缺失对应的两个测试用mps文件。自行编写测试代码验证,CyLP功能运行完全正常。
编译错误修复方案:修改ICbcModel.cpp文件,新增CbcSolverUsefulData实例,作为额外参数传入CbcMain0和CbcMain1函数即可。
内容的提问来源于stack exchange,提问作者PhQC
相关产品推荐
相关产品推荐

