Разверните облачную функцию Python со всеми зависимостями пакетов - PullRequest
1 голос
/ 11 июня 2019

Я хотел бы развернуть облачную функцию, которая не использует файл require.txt для установки пакетов. Я хочу, чтобы пакеты были доступны в хранилище или архивировались и загружались как часть функции. Возможно ли это?

РЕДАКТИРОВАТЬ 6/14/2019

В основном я хотел бы отправить пакеты типа numpy и pandas с моим кодом для развертывания облачной функции. Я хочу сделать это в случае, если pypi.org недоступен. Я попытался следовать этой части документации . Пример того, что я пытаюсь сделать, приведен ниже:

Структура папки:

-> my_folder
    -> main.py
    -> libs
        -> numpy (the entire package)
        -> pandas (the entire package)
        -> __init__.py

main.py

import libs.numpy as np
import libs.pandas as pd

def function()
    do stuff with numpy and pandas

Затем я попытался развернуть функцию из командной строки gcloud, а затем gcp UI, оба не удалось. Если это возможно, пожалуйста, помогите.

1 Ответ

2 голосов
/ 11 июня 2019

На данный момент есть только две опции:

  1. Использование requirements.txt
  2. Упаковка зависимостей вместе с вашей функцией, ссылка здесь

Они не могут быть заархивированы ни в хранилище, они будут рассматриваться как часть источника функции.

Если вы выберете второй вариант, параметр -t libs можетпомочь тебе.Вы можете использовать его для установки всего в папку libs, а затем просто переместить содержимое в локальный каталог.Как одна команда это выглядело бы так:

pip install -t libs [your library name(s)] && rm -rf libs/*.dist-info && mv -r libs/* . && rm -rf libs

Я добавил часть rm -rf libs/*.dist-info, чтобы не загрязнять исходную папку тоннами версии библиотеки и информации о распространении, которые бесполезны для функции.Они используются pip при замораживании и планировании обновлений.

РЕДАКТИРОВАТЬ 6/14/2019

Вы хранили библиотеки в папке libs.Это точка до mv -r libs/* . на однострочнике, который я добавил выше.

Использование папки libs сохраняет все более упорядоченным, поэтому, если вы хотите сохранить пакеты там, вам нужнопапка, добавляющая это в верхнюю часть вашего main.py, перед всеми другими импортами:

# Vendoring packages from libs folder
import sys
import os
sys.path.insert(1, os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "libs"
))
# All other imports go below this line

Объяснение:

__file__ - глобальная переменная, присутствующая в каждом модуле, который содержит путь кфайл, из которого был определен модуль, то есть файл, в котором он используется.В нашем случае путь к main.py.

Поскольку мы не можем быть уверены в рабочем каталоге в момент импорта main.py, мы передаем его в os.path.realpath, чтобы быть уверенным в структуре пути.Может быть os.path.abspath to, я видел и использовал оба, и не заметил никакой разницы.

Из пути к файлу мы получаем путь к каталогу вашего исходного кода с os.path.dirname изатем в папку libs внутри нее с os.path.join.

Теперь самая важная часть.Когда вы пытаетесь импортировать пакет, python ищет их по пути system / python.Поэтому мы добавляем полный путь libs, который мы создали, в качестве первого местоположения поиска по системному пути после вашего рабочего каталога .Новые операторы импорта будут сначала искать эту папку, а пакет там не будет, как обычно, продолжайте работу с остальными каталогами поиска.
Если вы предпочитаете искать пакеты в библиотеках, только если они недоступны в системе и среде python, добавьте путь libs вместо того, чтобы вставлять его в индекс 1.

После этого вам не нужно вводить libs. при импорте, просто используйте обычный import numpy.

В полностью независимых пакетах это может работать, но не в пакетах с зависимостями, поскольку они ожидают, что их зависимости будут импортироваться напрямую (из любой точки sys.path).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...