Нет модуля с именем '_cffi_backend' при запуске скрипта Python с использованием azure.storage.blob.BlockBlobService в Ubuntu в Docker - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть скрипт python3.6, который должен получать содержимое из хранилища больших двоичных объектов в Azure, которое я хочу запустить в док-контейнере Ubuntu 16.04.

Проблема

Я использую это dockerfile, потому что я также использую pyodbc для подключения к SQL Server.В моем файле требований я перечислил azure.storage, который устанавливается при сборке образа докера.Но при попытке запустить скрипт я получаю следующую ошибку:

root@b61c65dadb5d:/app# python3 val.py
Traceback (most recent call last):
  File "val.py", line 12, in <module>
    from azure.storage.blob import BlockBlobService
  File "/usr/local/lib/python3.6/dist-packages/azure/storage/__init__.py", line 21, in <module>
    from .models import (
  File "/usr/local/lib/python3.6/dist-packages/azure/storage/models.py", line 27, in <module>
    from cryptography.hazmat.primitives.keywrap import(
  File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/keywrap.py", line 12, in <module>
    from cryptography.hazmat.primitives.constant_time import bytes_eq
  File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/constant_time.py", line 11, in <module>
    from cryptography.hazmat.bindings._constant_time import lib
ImportError: No module named '_cffi_backend'

Что я пробовал

Я нашел пару предложений после некоторого поиска, одно из которых предложило запустить pip install cffi.При попытке этого я получаю:

root@b61c65dadb5d:/app# pip3 install cffi
Requirement already satisfied: cffi in /usr/local/lib/python3.6/dist-packages (1.12.2)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/dist-packages (from cffi) (2.19)

То же самое относится к pip install cryptography

Поскольку у Python возникли проблемы с поиском модуля Azure, для начала у меня это есть в начале моего скрипта, поэтомудолжен быть в состоянии найти что-нибудь, находящееся в этом каталоге:

import sys

sys.path.append('/usr/local/lib/python3.6/dist-packages')

(я знаю, что могу сделать это в Dockerfile, и я это сделаю)

Другие говорят, что добавление import cffi вСценарий Python решает проблему.Это не для меня.

Как воспроизвести

Эта проблема может быть легко воспроизведена с помощью этого минимального скрипта Python:

import sys

sys.path.append('/usr/local/lib/python3.6/dist-packages')

from azure.storage.blob import BlockBlobService

Затем создайте образ на основе Ubuntu 16.04, установка python 3.6 и установка azure.storage с помощью pip.Dockerfile:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y apt-utils

RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:jonathonf/python-3.6
RUN apt-get update && apt-get install -y \
    python3.6 \
    python3.6-dev \
    python3-pip \
    python3-setuptools \
    python3-wheel \
    --no-install-recommends && \
    python3.6 -m pip install --upgrade pip && \
    rm -rf /var/lib/apt/lists/* && \
    alias python=python3.6

RUN pip3 install azure.storage

COPY /app /app
WORKDIR /app

Либо запустите его в интерактивном режиме, либо добавьте CMD для запуска скрипта.Обратите внимание, что скрипт python должен находиться в папке с именем app в том же каталоге, что и Dockerfile.

Если вы используете interacive, вы можете попробовать pip3 install cffi, чтобы убедиться, что он уже установлен.

Примечание:

Я также хочу упомянуть, что у меня возникает похожая проблема при попытке подключиться к служебной шине Azure.Но я создам другой вопрос для этой специфической проблемы, если почувствую необходимость позже.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Боюсь, в PyPI нет пакета с именем azure.storage, который должен быть azure-storage, поэтому команда RUN pip3 install azure.storage неверна.На самом деле, когда команда pip install azure.storage устанавливает Azure Storage SDK для Python, она также загружает пакет azure_storage-0.36.0-py2.py3-none-any.whl для установки azure-storage с некоторыми проблемами, как показано на рисунке ниже.

enter image description here

Я думаю, что проблема, показанная в красной рамке рисунка выше, может нарушить прогресс в контейнере для следующей установки некоторых необходимых пакетов для azure-storage, таких как cffi, cryptography и т. Д.Поэтому я предложил вам использовать имя пакета corrent azure-storage, чтобы повторить попытку.

0 голосов
/ 08 апреля 2019

Мне не удалось заставить его работать с помощью образа ubuntu 16.04, однако он работает с использованием образа python 3.6.

Как указал Питер Пэн в своем ответе, имя пакета было неверным,Это должно быть azure-storage, а не azure.storage.Тем не менее проблема не исчезла после изменения его на правильное имя (кажется, что он все еще был в состоянии получить правильный пакет, даже с неправильным именем).Это может быть локальная проблема на моей машине, я не знаю, я могу только предполагать на этом этапе.

В любом случае, он работает с использованием образа python 3.6, который в настоящее время основан на Debian 9, безлюбая проблема, которая решает эту проблему для меня.

Если у кого-то еще возникают подобные проблемы при использовании python для подключения к хранилищу BLOB-объектов Azure или другим функциям Azure, а также к Azure SQL, вот что я в итоге использовал:

FROM python:3.6

RUN apt-get update && apt-get install -y \
    curl apt-utils apt-transport-https debconf-utils gcc build-essential

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

RUN apt-get update
RUN ACCEPT_EULA=Y apt-get -y install msodbcsql17
RUN apt-get install -y unixodbc-dev

COPY /app /app
WORKDIR /app

RUN pip install -r requirements
CMD ["python", "val.py"]

Azure SDK должен работать "из коробки", все остальное - для подключения к SQL с ODBC.

Возможно, такие вещи, как gcc, не должны включаться в производственный процесс.изображение, но это не совсем относится к этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...