將遺留專案從 2.7 和 Ubuntu 18.04 [零碎,接下來是 Python 3.10 和 22.04……然后是 Flask!] 從 vendored 依賴項遷移到requirements.txt. 從專案根目錄中洗掉依賴項并在我的requirements.txt.
我的requirements.txt包含google-cloud-storage==1.44.0并venv-2-7/bin/python -m pip install -t lib -r requirements.txt與以下appengine_config.py目錄在同一目錄中app.yaml:
# From https://cloud.google.com/appengine/docs/legacy/standard/python/tools/using-libraries-python-27
import os
from google.appengine.ext import vendor
vendor.add('lib')
vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
如何解決此錯誤?- 嘗試venv-2-7/bin/python -c 'import google.cloud.storage'過,但:
$ venv-2-7/bin/python /google-cloud-sdk/platform/google_appengine/dev_appserver.py --host 127.0.0.1 .
[來自 PyCharm 和手動] 的錯誤:
ImportError: No module named google.cloud.storage
EDIT0:根據評論請求包括更多資訊[如下]:
app.yaml
runtime: python27
api_version: 1
threadsafe: yes
instance_class: F4
automatic_scaling:
min_idle_instances: automatic
handlers:
- url: /1/account.*
script: api_account.app
inbound_services:
- warmup
libraries: # Also tried removing this section entirely
- name: webapp2
version: latest
- name: jinja2
version: latest
- name: ssl
version: latest
env_variables:
PYTHONHTTPSVERIFY: 1
skip_files:
- ^(.*/)?.*\.py[co]$
EDIT1:獨立嘗試兩種解決方案,甚至一起嘗試:
import os
import sys
import pkg_resources
import google
if os.environ.get("GOOGLE_CLOUD_SDK_APPENGINE"):
sys.path.insert(0, os.environ["GOOGLE_CLOUD_SDK_APPENGINE"])
for lib_dir in os.path.join(os.path.dirname(__file__), 'lib'), 'lib':
sys.path.insert(0, lib_dir)
google.__path__.append(os.path.join(lib_dir, 'google'))
pkg_resources.working_set.add_entry(lib_dir)
import google.cloud.storage
有什么技巧嗎from google.appengine.ext import vendor,我不應該/google-cloud-sdk/platform/google_appengine用作我的嗎?GOOGLE_CLOUD_SDK_APPENGINE環境變數嗎?
EDIT2:我嘗試行內google.appengine.ext.vendor并在回圈中呼叫它,這給了我一個ImportError: No module named google.cloud._helpers錯誤
uj5u.com熱心網友回復:
我沒有試圖重現你的錯誤,但相信你。乍一看,您的內容似乎appengine_config.py不完整。當您有非 GCP 3P 依賴項時,這就足夠了:
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
但是,如果您requirements.txt有 GCP 客戶端庫,例如,google-cloud-*您appengine_config.py需要使用pkg_resources來支持它們的使用:
import pkg_resources
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)
要引入pkg_resources,您需要將setuptools和添加grpcio到您的app.yaml,并且要google-cloud-storage特別使用,您還需要添加ssl:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
- name: ssl
version: latest
當您最終升級到 Python 3 時,所有這些 3P pkg 游戲都“消失”了,但您的代碼requirements.txt保持不變,但您洗掉appengine_config.py并替換app.yaml為以下內容(如果您不提供靜態檔案):
runtime: python310
這些相同的說明也可以在遷移捆綁服務頁面上的 App Engine 檔案中找到。該頁面基本上說明了我剛剛為 Python 2 和 3 所做的事情。
<廣告>
當您準備好升級到 Python 3 和/或將 App Engine 捆綁服務(NDB、Task Queue [push & pull]、Memcache、Blobstore 等)升級到獨立的 Cloud 等價物(Cloud NDB、Cloud Tasks [push]或 Cloud Pub/Sub [pull]、Cloud Memorystore、Cloud Storage (GCS) 等),或切換到Cloud Functions或Cloud Run,我已經制作(嗯,仍在制作)一個包含代碼示例的現代化遷移系列, codelab 教程和視頻,所有這些都是官方遷移檔案的補充。您可以找到更多資訊,包括所有這些資源的鏈接作為其開源存盤庫。特別是,您的詢問涉及 GCS,并且該遷移包含在“模塊 16”中。Mod16 應用程式是與 GCS 一起使用的示例,是其基于 Blobstore的模擬 Mod15 應用程式的遷移。
</廣告>
uj5u.com熱心網友回復:
我可以重現你的錯誤。
我曾經遇到過問題protobuf(該錯誤與您獲得的存盤有點相似)。解決方案是更新 google 命名空間包。我現在嘗試了相同的解決方案(用于存盤)并且您的錯誤消失了
更新你的代碼appengine_config.py到
from google.appengine.ext import vendor
import google, os
lib_dir = os.path.join(os.path.dirname(__file__), 'lib')
google.__path__.append(os.path.join(lib_dir, 'google'))
vendor.add('lib')
更新后appengine_config.py,該行import google.cloud.storage不再報錯No module named cloud.storage。
uj5u.com熱心網友回復:
用這個解決方案去核,我非常討厭這個:
import inspect
import io
import os.path
import site
import sys
from collections import deque
from copy import deepcopy
from itertools import chain
from distutils.sysconfig import get_python_lib
from functools import partial
from os import getcwd, listdir
import google
site_packages = os.path.join(
os.path.dirname(os.path.dirname(sys.executable)), get_python_lib(prefix="")
)
new_sys_path = [getcwd(), site_packages]
lib_dir = os.path.join(os.path.dirname(__file__), "lib")
new_sys_path.append(lib_dir)
appengine_python_sdk = (
os.environ["GOOGLE_CLOUD_SDK_APPENGINE"]
if os.environ.get("GOOGLE_CLOUD_SDK_APPENGINE")
else os.path.dirname(
os.path.dirname(
os.path.dirname(
os.path.dirname(
os.path.dirname(
inspect.getsourcefile(os.environ["wsgi.errors"].__class__)
)
)
)
)
)
)
lib_dir = os.path.join(os.path.dirname(__file__), "lib")
google_cloud_sdk_appengine = os.path.dirname(os.path.dirname(appengine_python_sdk))
non_venv_site_packages = os.path.dirname(inspect.getsourcefile(io))
google_cloud_sdk_appengine_lib = os.path.join(google_cloud_sdk_appengine, "lib")
def all_pkgs_for_dir(p):
return map(
partial(os.path.join, p),
filter(
lambda p: (lambda parts: parts[1] == "-" and parts[2][0].isdigit())(
p.rpartition("-")
),
listdir(p),
),
)
app_yaml_libraries = (
lambda g: [p[len(g) :].partition("-")[0] for p in sys.path if p.startswith(g)]
)(google_cloud_sdk_appengine_lib os.path.sep)
然后new_sys_path以正確的順序構造路徑:
new_sys_path = list(
chain.from_iterable(
(
(
getcwd(),
appengine_python_sdk,
os.path.dirname(os.path.dirname(appengine_python_sdk)),
non_venv_site_packages,
os.path.join(non_venv_site_packages, "lib-dynload"),
),
(
# Use new dependencies from `lib` dir if found
os.path.join(lib_dir, lib_p)
for lib_p in os.listdir(lib_dir)
if not lib_p.endswith(".dist-info")
and lib_p.partition("-")[0] in app_yaml_libraries
),
(
lib_dir,
site_packages,
google_cloud_sdk_appengine_lib,
),
)
)
)
sys.path = deepcopy(new_sys_path)
google.__path__ = deepcopy(new_sys_path)
deque(map(site.addsitedir, new_sys_path), maxlen=0)
如果有人有一個不那么老套的解決方案,我會全力以赴??......
僅供參考:目前正在除錯ImportError: No module named six錯誤,即使os.path.isfile(os.path.join(lib_dir, "six.py"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507748.html
標籤:Google Cloud Collective Python 谷歌应用引擎 谷歌应用引擎 python 谷歌云蟒
