与 sys.path 顺序无关的与 SDK 包导入同名的 python 站点包

标签 python python-2.7 google-app-engine google-cloud-platform google-cloud-shell

我正在尝试将 Google Cloud Shell 用作现有 App Engine Standard Python 2.7 应用程序的远程开发环境。已经安装了 SDK,所有的通信路径都已经建立(不用担心云身份验证/应用程序默认凭据/等),并且可以使用完整的一次性 VM(无需使用虚拟环境或任何其他 python 疯狂来使事情正常运行在共享环境中),这似乎是兼职开发/维护的理想设置。
...唉,我无法导入任何 appengine/google 软件包。
这似乎是 Google Cloud Shell 内部的一个问题。所以这里是解释清楚的步骤:
去打开一个全新的空谷歌 Shell:
https://shell.cloud.google.com/
键入此以查看应用程序引擎 SDK 的安装路径:

someuser@cloudshell:~$ echo $(gcloud info --format="value(installation.sdk_root)")/platform/google_appengine
/usr/lib/google-cloud-sdk/platform/google_appengine
注意 SDK 有一个 google_appengine/google文件夹...包含 appengine包裹:
someuser@cloudshell:~$ ls -la /usr/lib/google-cloud-sdk/platform/google_appengine/google
total 32
drwxr-xr-x  7 root root 4096 Nov 18 02:53 .
drwxr-xr-x  1 root root 4096 Nov 18 02:53 ..
drwxr-xr-x 12 root root 4096 Nov 18 02:53 appengine
-rw-r--r--  1 root root  601 Jan  1  1980 __init__.py
drwxr-xr-x  5 root root 4096 Nov 18 02:53 net
drwxr-xr-x  3 root root 4096 Nov 18 02:53 protobuf
drwxr-xr-x  2 root root 4096 Nov 18 02:54 __pycache__
drwxr-xr-x  3 root root 4096 Nov 18 02:53 pyglib
找到 python 站点包位置:
someuser@cloudshell:~$ python -c 'import site; print site.getsitepackages()'
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
注意:其中一个目录也有 google具有不同软件包的文件夹:
someuser@cloudshell:~$ ls -la /usr/local/lib/python2.7/dist-packages/google
total 60
drwxr-sr-x 15 root staff 4096 Nov 18 03:12 .
drwxrwsr-x  1 root staff 4096 Nov 18 03:40 ..
drwxr-sr-x  2 root staff 4096 Nov 18 03:11 api
drwxr-sr-x  5 root staff 4096 Nov 18 03:11 api_core
drwxr-sr-x  3 root staff 4096 Nov 18 03:11 _async_resumable_media
drwxr-sr-x  5 root staff 4096 Nov 18 03:11 auth
drwxr-sr-x 29 root staff 4096 Nov 18 03:12 cloud
drwxr-sr-x  3 root staff 4096 Nov 18 03:12 iam
drwxr-sr-x  3 root staff 4096 Nov 18 03:11 logging
drwxr-sr-x  2 root staff 4096 Nov 18 03:11 longrunning
drwxr-sr-x  2 root staff 4096 Nov 18 03:11 oauth2
drwxr-sr-x  6 root staff 4096 Nov 18 03:11 protobuf
drwxr-sr-x  3 root staff 4096 Nov 18 03:11 resumable_media
drwxr-sr-x  3 root staff 4096 Nov 18 03:11 rpc
drwxr-sr-x  2 root staff 4096 Nov 18 03:11 type
好的..让我们开始python:
someuser@cloudshell:~$ python

Python 2.7.16 (default, Oct 10 2019, 22:02:15)
[GCC 8.3.0] on linux2

# let's inspect the sys.path

>>> import sys

>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

# ^^ our SDK path isn't in there.  let's add it to the front of the list in the manner we're supposed to

>>> sys.path.insert(1, '/usr/lib/google-cloud-sdk/platform/google_appengine')

# lets look again

>>> sys.path
['', '/usr/lib/google-cloud-sdk/platform/google_appengine', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-pa
ckages', '/usr/lib/python2.7/dist-packages']

# ok, that should work... RIGHT?


>>> from google.appengine.api import urlfetch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named appengine.api

# NOPE... where's "appengine"???

>>> import google

# ummm....

>>> google.__path__
['/usr/local/lib/python2.7/dist-packages/google']

# ummmmmmmmmm.....
所以有几个问题,我不明白它们之间的关系或如何解决:
  • 云壳有googlegoogle 冲突的包SDK中的包
  • 为什么不尊重 sys.path 呢?

  • 这与包命名空间或其他东西有关......我不够聪明,无法弄清楚......请帮忙!

    最佳答案

    google.appengine模块被烘焙到第一代 Python (2.7) 运行时中。无法通过 pip 安装,在第二代 (3.x) 运行时或 Cloud Shell 中。
    使用它的唯一方法是编写和部署第一代 App Engine 应用程序。

    关于与 sys.path 顺序无关的与 SDK 包导入同名的 python 站点包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65111411/

    相关文章:

    python - 在python中搜索单个字符串中的字符串

    python - 使用一个类在另一个类中设置参数 - Python

    Python 新手 : pip install and syntax problems

    python - 用于查找用户最喜欢的故事的良好数据模型

    python - 如何正确传递文本文件来搜索那里的数据?

    python - 在单个命令中删除 python-Redis 中的多个键

    python - Numpy:根据密度函数生成网格

    python - 获取上一个条目

    python-2.7 - 使用 PIL 保存图像两次

    android - 如何将敏感数据从 Android 应用程序传递到 Google Cloud Endpoints?