Google Cloud Function - Kesalahan memuat fungsi: File main.py yang diharapkan untuk mendefinisikan fungsi tidak ada

Saya mencoba mengimplementasikan fungsi Google Cloud yang didasarkan pada kode dalam repositori gaya Git. Saya memiliki kode yang ditautkan ke "Repositori Sumber" Google Cloud Platform dan fungsi saya berjalan dengan baik ketika saya menyalin dan menempelkan kode tersebut ke "Editor Inline" Fungsi GCP. Saat saya beralih ke opsi "Repositori Sumber Cloud", saya tahu bahwa ia membaca dari repositori itu; Saya mengatasi kesalahan lain sebelum kesalahan ini. Namun, setelah menyelesaikan masalah sebelumnya/lainnya, sekarang saya mendapatkan kesalahan ini:

Function load error: File main.py that is expected to define function doesn't exist

file saya memiliki struktur yang mirip dengan ini, dengan main.py di direktori root:

.
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

Terbaca dengan baik dari requirements.txt (beberapa kesalahan sebelumnya berasal dari proses membaca tersebut), tetapi mengapa tidak terbaca dari main.py? Penyiapan saya di Fungsi GCP terlihat seperti ini:

Tangkapan layar jendela edit fungsi Google Cloud

Saya telah mencoba memindahkan main.py ke direktori lain dalam proyek dan mengatur "Direktori dengan kode sumber" ke direktori itu, tetapi itu memberi saya kesalahan yang mengatakan bahwa direktori itu tidak dapat ditemukan. Ada ide konstruktif?

Sunting / Informasi Tambahan

Saya menggunakan cabang dari repositori saya selain master, dan saya menggunakan pemicu topik Google Cloud Pubsub untuk fungsi ini.


person Jed    schedule 20.09.2018    source sumber
comment
Semuanya tampak benar. Bagaimana Anda menerapkan fungsi ini setelah melakukan perubahan?   -  person Dustin Ingram    schedule 20.09.2018
comment
Saya mendorong ke Bitbucket, dan itu disinkronkan dengan Repositori Sumber Google. Saya telah memverifikasi bahwa sinkronisasi terjadi sangat cepat (~1-2 detik). Saya baru saja menyegarkan halaman Google Source Repositories untuk memastikan... Masih tidak berfungsi.   -  person Jed    schedule 20.09.2018


Jawaban (5)


Apakah Anda menerapkan ulang fungsi setelah menerapkan komitmen baru? Anda harus melakukan sesuatu seperti:

gcloud functions deploy NAME \
  --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
  TRIGGER

Lihat https://cloud.google.com/functions/docs/deploying/repo untuk lebih jelasnya.

person Dustin Ingram    schedule 20.09.2018
comment
Untuk beberapa alasan, memindahkan main.py ke folder PACKAGE, lalu menggunakan perintah berikut berhasil sementara opsi lainnya tidak: gcloud functions deploy NAME --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/BRANCH_NAME/paths/PACKAGE/ --trigger-topic TOPIC - person Jed; 22.09.2018
comment
Adakah yang tahu mengapa saya tidak berhasil menyiapkan fungsi ini menggunakan GUI berbasis web untuk Fungsi GCP? - person Jed; 22.09.2018

Jika Anda mencoba mengunggah kode zip menggunakan keranjang GCS atau fungsi unggah file, pastikan Anda tidak membuat zip folder yang berisi kode Anda, melainkan hanya file kodenya.

CodeFolder
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

JANGAN membuat file Zip dari CodeFolder.

Sebaliknya, buat file zip dari main.py dan requirement.txt dan package.

Sumber

person MetalloyD    schedule 28.05.2019
comment
Sebagai gantinya, buat file zip dari main.py dan persyaratan.txt dan paket. - Kudos! - person Ayyappa; 16.09.2020

Apakah fungsi cloud Anda melakukan sesuatu sebelum mencapai fungsi titik masuk yang Anda tetapkan? Jika terjadi pengecualian yang tidak tertangani, GCF tidak akan mencapai fungsi titik masuk dan memunculkan kesalahan ini. Misalnya:

class SomeClass:
    def __init__(self):
        raise ValueError

err = SomeClass()

def main(event, context):
    pass

Akan memunculkan kesalahan yang sama: Function load error: File main.py that is expected to define function doesn't exist. Itu karena fungsi titik masuk Anda tidak pernah tercapai. Tinjau kode yang dijalankan sebelum fungsi Anda ditentukan dan kemungkinan besar Anda akan menemukan sesuatu yang salah.

person Igor Carrasco    schedule 26.05.2020

Saya punya masalah serupa (mungkin sama?). Apa yang terjadi dengan saya adalah semua file saya dalam format:

  1. [nama file zip]/main.py
  2. [nama file zip/[dll.]

dan kesalahannya terus mengatakan tidak dapat menemukan yang utama. Saya menduga ini karena ada folder induknya. Setelah melihat zip ke induknya sebentar, saya memutuskan bahwa itu bukan masalahnya.

Saya mengunduh zip dan melihat kode fungsi cloud dialogflow yang dibuat secara otomatis dan memperhatikan bahwa mereka memiliki file "package.json". Saya malah punya file "requirements.txt". Saya menyalin file package.json ke kode sumber saya, mengeditnya untuk konten yang benar, meng-zip-nya, dan fungsi cloud dikompilasi dengan benar.

package.json terlihat seperti:

{
  "name": "test",
  "description": "testingThings",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "ABCDEFG",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:test",
    "deploy": "firebase deploy --only functions:test"
  },
  "dependencies": {
    "google-cloud-storage": "",
    "google-cloud-firestore": "",
  }
}

Saya yakin mereka menggunakan ini untuk menerapkan fungsi cloud Google sehingga tanpanya fungsi tersebut akan rusak.

person Community    schedule 04.06.2019

Jika meskipun sudah ada jawaban lain, Anda masih belum bisa membuatnya berfungsi, saya akhirnya menghilangkan kesalahan ini dengan melakukan hal berikut:

  • pastikan jalur Anda ke file sudah benar (terutama file json jika Anda memuat kredensial dari file tersebut, hati-hati dengan jalur relatif)
  • periksa file requirements.txt Anda: Saya menggunakan pipreqs untuk membuatnya secara otomatis tetapi ada beberapa kesalahan ("_" alih-alih "-" untuk modul seperti google-cloud-tasks misalnya). Saya akan merekomendasikan menulis persyaratan.txt sendiri berdasarkan impor Anda.

Semoga membantu.

person garys    schedule 12.01.2020