主頁 > 資料庫 > `vendor.add`不會將依賴項暴露給dev_appserver.py

`vendor.add`不會將依賴項暴露給dev_appserver.py

2022-09-14 21:57:05 資料庫

將遺留專案從 2.7 和 Ubuntu 18.04 [零碎,接下來是 Python 3.10 和 22.04……然后是 Flask!] 從 vendored 依賴項遷移到requirements.txt. 從專案根目錄中洗掉依賴項并在我的requirements.txt.

我的requirements.txt包含google-cloud-storage==1.44.0venv-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 FunctionsCloud 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 谷歌云蟒

上一篇:即使增加了app_start_timeout_sec,App引擎404錯誤也無法進行就緒檢查

下一篇:有沒有辦法限制只允許來自其他AppEngine服務的傳入請求?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more