Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker中的Ubuntu上使用azure.storage.blob.BlockBlobsService运行python脚本时,没有名为“\u cffi\u backend”的模块_Python_Azure_Docker_Ubuntu - Fatal编程技术网

在Docker中的Ubuntu上使用azure.storage.blob.BlockBlobsService运行python脚本时,没有名为“\u cffi\u backend”的模块

在Docker中的Ubuntu上使用azure.storage.blob.BlockBlobsService运行python脚本时,没有名为“\u cffi\u backend”的模块,python,azure,docker,ubuntu,Python,Azure,Docker,Ubuntu,我有一个python3.6脚本,需要从Azure中的blob存储中获取内容,我想在Ubuntu 16.04 docker容器中运行它 问题 我使用dockerfile是因为我还使用pyodbc连接到SQL Server。在我的需求文件中,我列出了构建docker映像时安装的azure.storage。但在尝试运行脚本时,我遇到以下错误: root@b61c65dadb5d:/app# python3 val.py Traceback (most recent call last): File

我有一个python3.6脚本,需要从Azure中的blob存储中获取内容,我想在Ubuntu 16.04 docker容器中运行它

问题 我使用dockerfile是因为我还使用pyodbc连接到SQL Server。在我的需求文件中,我列出了构建docker映像时安装的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安装加密也是如此

因为python在开始时很难找到azure模块,所以我在脚本的开头有这样一个模块,所以它应该能够找到该目录中的任何内容:

import sys

sys.path.append('/usr/local/lib/python3.6/dist-packages')
我知道我可以在Dockerfile中这样做,我会的

其他人说,在python脚本中添加import cffi可以解决这个问题。这不适合我

如何繁殖 这个问题可以通过这个最小的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,并使用pip安装azure.storage。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脚本必须位于Dockerfile所在目录中名为app的文件夹中

如果您正在使用interacive,您可以尝试pip3安装cffi,以查看它是否已安装

旁注
我还想指出,在尝试连接azure上的服务总线时,我也遇到了类似的问题。但是,如果我以后觉得有必要,我会为这个特殊的问题创建另一个问题。

恐怕PyPI中没有名为azure.storage的包,应该是,因此运行pip3 install azure.storage的命令不正确。实际上,当命令pip install azure.storage安装azure storage SDK for Python时,它还将下载azure_storage-0.36.0-py2.py3-none-any.whl以安装azure存储包,但出现了一些问题,如下图所示


我认为上面图片红色框中显示的问题将破坏容器中的进度,以便下一步安装azure存储所需的一些软件包,如cffi、加密等。因此我建议您可以使用相应的软件包名称azure storage重试。

但是,我无法使用ubuntu 16.04映像使其正常工作,它确实可以使用python 3.6映像

正如彼得·潘在他的回答中指出的那样,包裹名称是错误的。它应该是azure存储,而不是azure.storage。但问题仍然存在,在将其更改为正确的名称后,它似乎仍然能够获得正确的包,即使名称错误。这可能是我机器上的一个局部问题,我不知道,我现在只能推测

不管怎么说,它使用Python3.6映像(目前基于Debian9)确实可以工作,没有任何问题,因此为我解决了这个问题

如果其他任何人在使用python连接到azure blob存储或其他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应该是开箱即用的,所有其他的东西都是用来用ODBC连接SQL的


可以说,gcc之类的东西不应该包含在生产映像中,但这与这个问题并不相关。

是的,正确的包名应该是azure storage,或者实际上推荐的名称是azure storage blob。奇怪的是,使用azure.storage至少对我来说是有效的。。。但将STIL更改为azure存储后,问题仍然存在。可能与缓存有关。我确实解决了我的问题,并将创造一个答案。@charlessu是的,事实上我已经解决了它,但不是通过做我问题中的事情。我会回答的。
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"]