1 回答

TA貢獻1844條經(jīng)驗 獲得超8個贊
我設(shè)法找到了解決方案。代碼沒問題。問題是我的配置。
如上所述,我測試了 gcc/gfortran 的不同配置,看它是否影響 Cythonizing。它不是。因此,我繼續(xù)反匯編我的 Dockerfile,以找到導致代碼中斷的步驟。原來是conda安裝了numpy。
我上面使用 pip 進行的所有 ggc 圖像測試:
$ python -m pip install numpy
Collecting numpy
Downloading numpy-1.18.4-cp38-cp38-manylinux1_x86_64.whl (20.7 MB)
|████████████████████████████████| 20.7 MB 18.9 MB/s
Installing collected packages: numpy
Successfully installed numpy-1.18.4
一包一輪,快速簡單。但是,我在“生產(chǎn)”圖像中使用了 conda。
如果你通過 conda 安裝 numpy:
$ conda install numpy
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /opt/conda
added / updated specs:
- numpy
The following packages will be downloaded:
package | build
---------------------------|-----------------
blas-1.0 | mkl 6 KB
intel-openmp-2020.1 | 217 780 KB
libgfortran-ng-7.3.0 | hdf63c60_0 1006 KB
mkl-2020.1 | 217 129.0 MB
mkl-service-2.3.0 | py38he904b0f_0 62 KB
mkl_fft-1.0.15 | py38ha843d7b_0 159 KB
mkl_random-1.1.1 | py38h0573a6f_0 341 KB
numpy-1.18.1 | py38h4f9e942_0 5 KB
numpy-base-1.18.1 | py38hde5b4d6_1 4.2 MB
------------------------------------------------------------
Total: 135.5 MB
...
這里需要注意的重要一點是,除了 numpy 之外,conda 也在安裝libgfortran-ng-7.3.0. 在我正在處理的圖像中,安裝了 gcc/gfortran 8.5.0。
為什么這很重要?當你運行 cython 編譯時:
$ python setup.py build_ext --inplace
running build_ext
cythoning pattern.pyx to pattern.c
building 'pattern' extension
creating build
creating build/temp.linux-x86_64-3.8
gcc -pthread -B /opt/conda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/opt/conda/lib/python3.8/site-packages/numpy/core/include -I/opt/conda/include/python3.8 -c pattern.c -o build/temp.linux-x86_64-3.8/pattern.o
In file included from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h:1832,
from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,
from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h:4,
from pattern.c:599:
/opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
#warning "Using deprecated NumPy API, disable it with " \
^~~~~~~
gcc -pthread -shared -B /opt/conda/compiler_compat -L/opt/conda/lib -Wl,-rpath=/opt/conda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.8/pattern.o -lgfortran -o /mwe/pattern.cpython-38-x86_64-linux-gnu.so PATTERN_wrap.o
正如您在列表行中看到的,傳遞給 gcc 的包含是/opt/conda/lib.
$ ls /opt/conda/lib | grep "fortran"
libgfortran.so
libgfortran.so.4
libgfortran.so.4.0.0
這是libgfortran我最初編譯代碼時使用的不同版本。
解決方案是:
$ conda install -c conda-forge libgfortran-ng==8.2.0
注意:使用 conda-forge 通道是必要的,在我的例子中,conda 無法解決僅來自基本通道的包的依賴關(guān)系。此外,此版本的 libgfortran-ng 還需要將 libblas 從 openblas 版本更改為 mkl,如果您擔心的話。
通過這種方式,我在 conda 中安裝了一個 libgfortran,它與我在系統(tǒng)中使用的主版本相同。重新運行 Cythonized 包的編譯后,一切正常。
無論如何,當心康達。
添加回答
舉報