У меня странная ошибка при попытке импортировать cyvcf2. Я получаю:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import cyvcf2
File "/usr/local/lib/python2.7/dist-packages/cyvcf2/__init__.py", line 1, in <module>
from .cyvcf2 import (VCF, Variant, Writer, r_ as r_unphased, par_relatedness,
ImportError: /usr/local/lib/python2.7/dist-packages/cyvcf2/cyvcf2.so: undefined symbol: aaf
Если я использую вместо этого debian-buster, то я не получаю ошибку.
Минимальный Dockerfile, который работает:
FROM python:2.7.17-slim-buster
WORKDIR /opt/example
RUN apt-get update && apt-get install -y \
build-essential \
libbz2-dev \
libcurl4-openssl-dev \
liblzma-dev \
libssl-dev \
lzma-dev
RUN pip install cyvcf2
RUN echo "import cyvcf2" > test.py
RUN python test.py
Минимальный Dockerfile что не получается:
FROM ubuntu:18.04
WORKDIR /opt/example
RUN apt-get update && apt-get install -y \
build-essential \
libbz2-dev \
libcurl4-openssl-dev \
liblzma-dev \
libssl-dev \
lzma-dev \
python \
python-pip
RUN pip install cyvcf2
RUN echo "import cyvcf2" > test.py
RUN python test.py
Есть идеи, почему это происходит?
Я заметил, что aaf определен как встроенная функция в заголовочном файле в установленном пакете:
// internal calculate of alternate allele frequency.
inline float aaf(int *gt_types, int32_t n_samples){
float af = 0;
int i, n_called = 0;
for (i = 0; i < n_samples; i++){
if(gt_types[i] == _UNKNOWN){
continue;
}
af += gt_types[i];
n_called += 1;
}
return af / (float)(2 * n_called);
}
Должна ли встроенная функция быть в файле .so?
[Редактировать] Если я удалю ключевое слово "inline" из этой функции и одно другое из файла relatedness.h, тогда я смогу скомпилировать и установить пакет с помощью pip install -e. и работает нормально.
Почему разные ОС влияют на поведение встроенной функции?