关于python:ImportError:没有名为google.auth的模块

ImportError: No module named google.auth

当我尝试在python 2.7中导入firebase_admin时,出现错误:

ImportError: No module named google.auth

这是我正在使用的DockerFile。

我已经使用以下代码从源代码安装了Python

1
2
3
4
5
6
wget https://www.python.org/ftp/python/2.7/Python-2.7.tgz
tar xvzf Python-2.7.tgz
cd Python-2.7
./configure
make
make install

然后我通过运行以下命令安装了pip和firebase admin:

1
2
apt-get install -y python-pip
pip install firebase-admin

然后我在python shell中运行了import firebase_admin
我得到了错误:

ImportError: No module named google.auth

我运行pip show google.auth并获得以下输出:

1
2
3
4
5
6
7
8
9
10
Name: google-auth
Version: 1.6.3
Summary: Google Authentication Library
Home-page: https://github.com/GoogleCloudPlatform/google-auth-
library-python
Author: Google Cloud Platform
Author-email: jonwayne+google-auth@google.com
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: cachetools, six, pyasn1-modules, rsa

我运行echo $PYTHONPATH并得到了这个:

/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages

这意味着google.auth已安装且其目录位于PYTHONPATH中,为什么python无法找到它? 以及如何解决?


我查看了adamantium/flutter的图像,并在Dockerfile中看到它取决于直接随Python2一起提供的ubuntu:18.04,如PEP-394中所述(有关此信息,请参见下面的链接)。

https://www.python.org/dev/peps/pep-0394/

因此,我不明白您为什么要重新安装它。发生的事情是您使用了一个Dockerfile,该文件在/usr/local/bin/中安装了另一个版本的Python2,并覆盖了指向原始Python2的符号链接,如您在docker build日志中看到的那样

1
2
3
4
5
if test -f /usr/local/bin/python -o -h /usr/local/bin/python; \\
then rm -f /usr/local/bin/python; \\
else true; \\
fi
(cd /usr/local/bin; ln python2.7 python)

然后,您可以验证容器中的当前Python解释器:

1
2
3
4
5
root@9b9176e6c26c:/# which python
/usr/local/bin/python

root@9b9176e6c26c:/# python --version
Python 2.7

同时,我从Dockerfile中删除了安装Python2的部分并得到了它。

1
2
3
4
5
root@e6dd827dac1d:/# which python
/usr/bin/python

root@e6dd827dac1d:/# python --version
Python 2.7.15rc1

然后直接导入您想要的内容:

1
2
3
4
root@e6dd827dac1d:/# python -c"import firebase_admin"

root@e6dd827dac1d:/# echo $?
0

您可以通过返回代码0看到成功。

修改后的Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM adamantium/flutter

RUN apt-get update && \\
    apt-get install -y wget && \\
    apt-get install -y build-essential && \\
    apt-get install -y zlib1g && \\
    apt-get install zlib1g-dev && \\
    wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz && \\
    tar xvzf Python-3.6.7.tgz && \\
    cd Python-3.6.7 && \\
    ./configure && make && \\
    make install

RUN apt-get install -y python-pip && \\
    pip install firebase-admin


构建您的Docker映像后:docker build -t test -f Dockerfile .,我得到的结果与您所描述的不同。

  • echo $PYTHONPATH的结果未返回任何内容
  • 运行位于/usr/local/bin/python的python解释器使我可以导入firebase_admin

以供参考:

1
2
3
4
5
6
7
8
$ which pip
/usr/bin/pip
$ /usr/bin/python
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15)
[GCC 7.3.0] on linux2
Type"help","copyright","credits" or"license" for more information.
>>> import firebase_admin
>>>

如果您打算在Dockerfile中运行脚本(即CMD / ENTRYPOINT),我建议传入工作解释器的完整路径,本例中的完整路径位于/usr/local/bin/python