Memecahkan masalah kesalahan Python di Azure Functions

Artikel ini menyediakan informasi untuk membantu Anda memecahkan masalah kesalahan dengan fungsi Python Anda di Azure Functions. Artikel ini mendukung model pemrograman v1 dan v2. Pilih model yang ingin Anda gunakan dari pemilih di bagian atas artikel.

Catatan

Model pemrograman Python v2 hanya didukung dalam runtime fungsi 4.x. Untuk informasi selengkapnya, lihat Ringkasan versi runtime Azure Functions.

Berikut adalah bagian pemecahan masalah untuk masalah umum dalam fungsi Python:

Pemecahan masalah: ModuleNotFoundError

Bagian ini membantu Anda memecahkan masalah kesalahan terkait modul di aplikasi fungsi Python Anda. Kesalahan ini biasanya mengakibatkan pesan kesalahan Azure Functions berikut ini:

Pengecualian: ModuleNotFoundError: Tidak ada modul bernama 'module_name'.

Kesalahan ini terjadi ketika aplikasi fungsi Python gagal memuat modul Python. Akar penyebab kesalahan ini adalah salah satu masalah berikut:

Menampilkan file proyek

Untuk mengidentifikasi penyebab sebenarnya dari masalah Anda, Anda perlu mendapatkan file proyek Python yang berjalan di aplikasi fungsi Anda. Jika Anda tidak memiliki file proyek di komputer lokal, Anda bisa mendapatkannya dengan salah satu cara berikut:

  • Jika aplikasi fungsi memiliki WEBSITE_RUN_FROM_PACKAGE pengaturan aplikasi dan nilainya adalah URL, unduh file dengan menyalin dan menempelkan URL ke browser Anda.
  • Jika aplikasi fungsi telah WEBSITE_RUN_FROM_PACKAGE diatur ke 1, buka https://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages dan unduh file dari URL terbaru href .
  • Jika aplikasi fungsi tidak memiliki salah satu pengaturan aplikasi sebelumnya, buka https://<app-name>.scm.azurewebsites.net/api/settings dan temukan URL di bawah SCM_RUN_FROM_PACKAGE. Unduh file dengan menyalin dan menempelkan URL ke browser Anda.
  • Jika saran mengatasi masalah, buka https://<app-name>.scm.azurewebsites.net/DebugConsole dan lihat konten di bawah /home/site/wwwroot.

Sisa artikel ini membantu Anda memecahkan masalah potensial penyebab kesalahan ini dengan memeriksa konten aplikasi fungsi Anda, mengidentifikasi akar penyebabnya, dan menyelesaikan masalah tertentu.

Diagnose ModuleNotFoundError

Bagian ini merinci potensi akar penyebab kesalahan terkait modul. Setelah Anda mengetahui mana yang mungkin menjadi akar penyebabnya, Anda dapat pergi ke mitigasi terkait.

Paket tidak ditemukan

Masuk ke .python_packages/lib/python3.6/site-packages/<package-name> atau .python_packages/lib/site-packages/<package-name>. Jika jalur berkas tidak ada, jalur yang hilang ini kemungkinan penyebab akarnya.

Menggunakan alat pihak ketiga atau yang sudah kedaluarsa selama penyebaran dapat menyebabkan masalah ini.

Untuk mengurangi masalah ini, lihat Mengaktifkan build jarak jauh atau Membangun dependensi asli.

Paket tidak diselesaikan dengan roda Linux yang tepat

Masuk ke .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info atau .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Gunakan editor teks favorit Anda untuk membuka file roda dan memeriksa bagian Tag. Masalahnya mungkin nilai tag tidak berisi linux.

Fungsi Python hanya berjalan di Linux di Azure. Runtime Functions v2.x berjalan pada Debian Stretch, dan runtime v3.x berjalan pada Debian Buster. Artefak ini diharapkan mengandung biner Linux yang benar. Saat Anda menggunakan --build local bendera di Core Tools, alat pihak ketiga, atau kedaluarsa, bendera tersebut dapat menyebabkan biner yang lebih lama digunakan.

Untuk mengurangi masalah, lihat Mengaktifkan build jarak jauh atau Membangun dependensi asli.

Paket ini tidak kompatibel dengan versi penerjemah Python

Masuk ke .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info atau .python_packages/lib/site-packages/<package-name>-<version>-dist-info. Di editor teks Anda, buka file METADATA dan periksa bagian Pengklasifikasi : . Jika bagian tidak berisi Python :: 3, , Python :: 3.6, Python :: 3.7Python :: 3.8, atau Python :: 3.9, versi paket terlalu lama atau, kemungkinan besar, sudah tidak ada pemeliharaan.

Anda dapat memeriksa versi Python aplikasi fungsi Anda dari portal Microsoft Azure. Navigasi ke halaman sumber daya Gambaran Umum aplikasi fungsi Anda untuk menemukan versi runtime. Versi runtime mendukung versi Python seperti yang dijelaskan dalam gambaran umum versi runtime Azure Functions.

Untuk mengurangi masalah, lihat Memperbarui paket Anda ke versi terbaru atau Mengganti paket dengan yang setara.

Paket berkonflik dengan paket lain

Jika Anda telah memverifikasi bahwa paket diselesaikan dengan benar dengan roda Linux yang tepat, mungkin ada konflik dengan paket lain. Dalam paket tertentu, dokumentasi PyPi mungkin mengklarifikasi modul yang tidak kompatibel. Misalnya, di azure 4.0.0, Anda menemukan pernyataan berikut:

Paket ini tidak kompatibel dengan azure-storage. Jika Anda menginstal azure-storage, atau jika Anda menginstal azure 1.x/2.x dan tidak menghapus instalan azure-storage, Anda harus menghapus instalan azure-storage terlebih dahulu.

Anda dapat menemukan dokumentasi untuk versi paket Anda di https://pypi.org/project/<package-name>/<package-version>.

Untuk mengurangi masalah, lihat Memperbarui paket Anda ke versi terbaru atau Mengganti paket dengan yang setara.

Paket hanya mendukung platform Windows dan macOS

Buka requirements.txt dengan editor teks dan periksa paket di https://pypi.org/project/<package-name>. Beberapa paket hanya berjalan pada platform Windows dan macOS. Misalnya, pywin32 hanya berjalan di Windows.

Kesalahan Module Not Found mungkin tidak terjadi saat Anda menggunakan Windows atau macOS untuk pengembangan lokal. Namun, paket gagal diimpor di Azure Functions, yang menggunakan Linux pada runtime. Masalah ini kemungkinan disebabkan oleh penggunaan pip freeze untuk mengekspor lingkungan virtual ke requirements.txt dari komputer Windows atau macOS Anda selama inisialisasi proyek.

Untuk mengurangi masalah, lihat Mengganti paket dengan yang setara atau requirements.txt Handcraft.

Mitigasi ModuleNotFoundError

Berikut ini adalah mitigasi potensial untuk masalah terkait modul. Gunakan diagnosis yang disebutkan sebelumnya untuk menentukan mitigasi mana yang akan dicoba.

AKtifkan build jarak jauh

Pastikan build jarak jauh diaktifkan. Cara Anda memastikan tergantung pada metode penyebaran Anda.

Pastikan bahwa versi terbaru ekstensi Azure Functions untuk Visual Studio Code telah diinstal. Verifikasi bahwa file .vscode/settings.json ada dan berisi pengaturan "azureFunctions.scmDoBuildDuringDeployment": true. Jika tidak, buat file dengan azureFunctions.scmDoBuildDuringDeployment pengaturan diaktifkan, lalu sebarkan ulang proyek.

Membangun dependensi asli

Pastikan bahwa versi terbaru Docker dan Azure Functions Core Tools diinstal. Buka folder proyek fungsi lokal Anda, dan gunakan func azure functionapp publish <app-name> --build-native-deps untuk penyebaran.

Perbarui paket Anda ke versi terbaru

Di versi https://pypi.org/project/<package-name>paket terbaru , periksa bagian Pengklasifikasi : . Paket harus OS Independent, atau kompatibel dengan POSIX atau POSIX :: Linux dalam Sistem Operasi. Selain itu, bahasa pemrograman harus berisi: Python :: 3, , Python :: 3.6, Python :: 3.7Python :: 3.8, atau Python :: 3.9.

Jika item paket ini benar, Anda dapat memperbarui paket ke versi terbaru dengan mengubah baris <package-name>~=<latest-version> di requirements.txt.

Modifikasi requirements.txt

Beberapa pengembang menggunakan pip freeze > requirements.txt untuk menghasilkan daftar paket Python untuk lingkungan pengembangan mereka. Meskipun kenyamanan ini bekerja dalam banyak kasus, bisa terdapat masalah dalam skenario penyebaran lintas platform, seperti mengembangkan fungsi secara lokal di Windows atau macOS, tetapi menerbitkan ke aplikasi fungsi, yang berjalan di Linux. Dalam skenario ini, pip freeze dapat memperkenalkan dependensi sistem operasi tertentu yang tidak terduga atau dependensi untuk lingkungan pengembangan lokal Anda. Dependensi ini dapat merusak aplikasi fungsi Python saat berjalan di Linux.

Praktik terbaik adalah memeriksa pernyataan impor dari setiap file .py dalam kode sumber proyek Anda dan kemudian hanya memeriksa modul dalam file requirements.txt . Praktik ini menjamin bahwa resolusi paket dapat ditangani dengan benar pada sistem operasi yang berbeda.

Ganti paket dengan yang ekuivalen

Pertama, lihat versi terbaru paket di https://pypi.org/project/<package-name>. Paket ini biasanya memiliki halaman GitHub sendiri. Buka bagian Masalah di GitHub dan cari untuk melihat apakah masalah Anda telah diperbaiki. Jika telah diperbaiki, perbarui paket ke versi terbaru.

Terkadang, paket mungkin telah diintegrasikan ke dalam Pustaka Standar Python (seperti pathlib). Jika demikian, karena kami menyediakan distribusi Python tertentu di Azure Functions (Python 3.6, Python 3.7, Python 3.8, dan Python 3.9), paket dalam file requirements.txt Anda harus dihapus.

Namun, jika Anda menemukan bahwa masalah belum diperbaiki, dan Anda berada pada tenggat waktu, kami mendorong Anda untuk melakukan penelitian untuk menemukan paket serupa untuk proyek Anda. Biasanya, komunitas Python memberi Anda berbagai pustaka serupa yang dapat Anda gunakan.

Menonaktifkan bendera isolasi dependensi

Atur pengaturan aplikasi PYTHON_ISOLATE_WORKER_DEPENDENCIES ke nilai 0.


Pemecahan masalah: tidak dapat mengimpor 'cygrpc'

Bagian ini membantu Anda memecahkan masalah kesalahan terkait 'cygrpc'di aplikasi fungsi Python Anda. Kesalahan ini biasanya mengakibatkan pesan kesalahan Azure Functions berikut ini:

Tidak dapat mengimpor nama 'cygrpc' dari 'grpc._cython'

Kesalahan ini terjadi ketika aplikasi fungsi Python gagal dimulai dengan penerjemah Python yang tepat. Akar penyebab kesalahan ini adalah salah satu masalah berikut:

Mendiagnosis kesalahan referensi 'cygrpc'

Ada beberapa kemungkinan penyebab kesalahan yang mereferensikan cygrpc, yang dirinci di bagian ini.

Penerjemah Python tidak sesuai arsitektur OS

Ketidakcocokan ini kemungkinan besar disebabkan oleh penerjemah Python 32-bit yang diinstal pada sistem operasi 64-bit Anda.

Jika Anda menjalankan sistem operasi x64, pastikan bahwa penerjemah Python versi 3.6, 3.7, 3.8, atau 3.9 Anda juga menggunakan versi 64-bit.

Anda dapat memeriksa bitness interpreter Python Anda dengan menjalankan perintah berikut:

Pada Windows di PowerShell, jalankan py -c 'import platform; print(platform.architecture()[0])'.

Pada shell seperti Unix, jalankan python3 -c 'import platform; print(platform.architecture()[0])'.

Jika ada ketidakcocokan antara bitness interpreter Python dan arsitektur sistem operasi, unduh interpreter Python yang tepat dari Python Software Foundation.

Penerjemah Python tidak didukung oleh Azure Functions Python Worker

Azure Functions Python Worker hanya mendukung versi Python tertentu.

Periksa untuk melihat apakah penerjemah Python Anda cocok dengan versi yang diharapkan dengan py --version di Windows atau python3 --version di sistem seperti Unix. Pastikan bahwa hasil pengembalian adalah salah satu versi Python yang didukung.

Jika versi penerjemah Python Anda tidak memenuhi persyaratan untuk Azure Functions, unduh versi penerjemah Python yang didukung oleh Functions dari Python Software Foundation.


Pemecahan masalah: python keluar dengan kode 137

Kesalahan kode 137 biasanya disebabkan oleh masalah di luar memori pada aplikasi fungsi Python Anda. Akibatnya, Anda mendapatkan pesan kesalahan Azure Functions berikut ini:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python keluar dengan kode 137

Kesalahan ini terjadi ketika aplikasi fungsi Python dipaksa untuk dihentikan oleh sistem operasi dengan SIGKILL sinyal. Sinyal ini biasanya menunjukkan kesalahan di luar memori dalam proses Python Anda. Platform Azure Functions memiliki batasan layanan yang mengakhiri aplikasi fungsi apa pun yang melebihi batas ini.

Untuk menganalisis hambatan memori di aplikasi fungsi Anda, lihat Profil aplikasi fungsi Python di lingkungan pengembangan lokal.


Pemecahan masalah: python keluar dengan kode 139

Bagian ini membantu Anda memecahkan masalah kesalahan terkait modul di aplikasi fungsi Python Anda. Kesalahan ini biasanya mengakibatkan pesan kesalahan Azure Functions berikut ini:

Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python keluar dengan kode 139

Kesalahan ini terjadi ketika aplikasi fungsi Python dipaksa untuk dihentikan oleh sistem operasi dengan SIGSEGV sinyal. Sinyal ini menunjukkan pelanggaran segmentasi memori, yang dapat dihasilkan dari pembacaan yang tidak terduga dari atau menulis ke wilayah memori terbatas. Di bagian berikut, kami menyediakan daftar penyebab akar umum.

Regresi dari paket pihak ketiga

Dalam file requirements.txt aplikasi fungsi Anda, paket yang tidak disematkan akan ditingkatkan ke versi terbaru selama setiap penyebaran ke Azure. Pembaruan paket berpotensi memperkenalkan regresi yang memengaruhi aplikasi Anda. Untuk memulihkan dari masalah tersebut, komentari pernyataan impor, nonaktifkan referensi paket, atau sematkan paket ke versi sebelumnya di requirements.txt.

Membongkar dari file .pkl yang salah

Jika aplikasi fungsi Anda menggunakan pustaka acar Python untuk memuat objek Python dari file .pkl , ada kemungkinan file berisi string byte yang salah bentuk atau referensi alamat yang tidak valid. Untuk memulihkan dari masalah ini, coba komentari pickle.load() fungsi .

Tabrakan koneksi Pyodbc

Jika aplikasi fungsi Anda menggunakan pyodbc driver database ODBC populer, ada kemungkinan bahwa beberapa koneksi terbuka dalam satu aplikasi fungsi. Untuk menghindari masalah ini, gunakan pola singleton, dan pastikan bahwa hanya satu koneksi pyodbc yang digunakan di seluruh aplikasi fungsi.


Pemicu sinkronisasi gagal

Kesalahan Sync triggers failed dapat disebabkan oleh beberapa masalah. Salah satu penyebab potensial adalah konflik antara dependensi yang ditentukan pelanggan dan modul bawaan Python saat fungsi Anda berjalan dalam paket App Service. Untuk informasi selengkapnya, lihat Manajemen paket.


Pemecahan masalah: tidak dapat memuat file atau rakitan

Anda dapat melihat kesalahan ini saat menjalankan secara lokal menggunakan model pemrograman v2. Kesalahan ini disebabkan oleh masalah yang diketahui diselesaikan dalam rilis mendatang.

Ini adalah contoh pesan untuk kesalahan ini:

DurableTask.Netherite.AzureFunctions: Tidak dapat memuat file atau rakitan 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=netral, PublicKeyToken=014045d636e89289'.
Sistem tidak dapat menemukan file yang ditentukan

Kesalahan terjadi karena masalah dengan bagaimana bundel ekstensi di-cache. Untuk memecahkan masalah, jalankan perintah ini dengan --verbose untuk melihat detail selengkapnya:

func host start --verbose

Kemungkinan Anda melihat masalah penembolokan ini ketika Anda melihat log pemuatan ekstensi seperti Loading startup extension <> itu tidak diikuti oleh Loaded extension <>.

Untuk mengatasi masalah ini:

  1. .azure-functions-core-tools Temukan jalur dengan menjalankan:

    func GetExtensionBundlePath
    
  2. Hapus .azure-functions-core-tools direktori.

    rm -r <insert path>/.azure-functions-core-tools
    

Direktori cache dibuat ulang saat Anda menjalankan Core Tools lagi.

Pemecahan masalah: tidak dapat mengatasi koneksi Azure Storage

Anda mungkin melihat kesalahan ini di output lokal Anda sebagai pesan berikut:

Microsoft.Azure.WebJobs.Extensions.DurableTask: Tidak dapat mengatasi koneksi Azure Storage bernama 'Storage'.
Nilai tidak boleh null. (Parameter 'penyedia')

Kesalahan ini adalah hasil dari bagaimana ekstensi dimuat dari bundel secara lokal. Untuk mengatasi kesalahan ini, lakukan salah satu tindakan berikut:

  • Gunakan emulator penyimpanan seperti Azurite. Opsi ini adalah yang baik ketika Anda tidak berencana untuk menggunakan akun penyimpanan di aplikasi fungsi Anda.

  • Buat akun penyimpanan dan tambahkan string koneksi ke AzureWebJobsStorage variabel lingkungan dalam file localsettings.json. Gunakan opsi ini saat Anda menggunakan pemicu atau pengikatan akun penyimpanan dengan aplikasi Anda, atau jika Anda memiliki akun penyimpanan yang sudah ada. Untuk memulai, lihat Membuat akun penyimpanan.

Fungsi tidak ditemukan setelah penyebaran

Ada beberapa masalah build umum yang dapat menyebabkan fungsi Python tidak ditemukan oleh host setelah penyebaran yang tampaknya berhasil:

  • Kumpulan agen harus berjalan di Ubuntu untuk menjamin bahwa paket dipulihkan dengan benar dari langkah build. Pastikan templat penyebaran Anda memerlukan lingkungan Ubuntu untuk build dan penyebaran.

  • Saat aplikasi fungsi tidak berada di akar repositori sumber, pastikan langkah tersebut pip install mereferensikan lokasi yang benar untuk membuat .python-packages folder. Perlu diingat bahwa lokasi ini peka huruf besar/kecil, seperti dalam contoh perintah ini:

    pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
    
  • Templat harus menghasilkan paket penyebaran yang dapat dimuat ke dalam /home/site/wwwroot. Di Azure Pipelines, ini dilakukan oleh ArchiveFiles tugas.

Masalah pengembangan di portal Azure

Saat menggunakan portal Azure, mempertimbangkan masalah yang diketahui ini dan solusinya:

  • Untuk menghapus fungsi dari aplikasi fungsi di portal, hapus kode fungsi dari file itu sendiri. Tombol Hapus tidak berfungsi untuk menghapus fungsi saat menggunakan model pemrograman Python v2.
  • Saat membuat fungsi di portal, Anda mungkin ditegur untuk menggunakan alat yang berbeda untuk pengembangan. Ada beberapa skenario di mana Anda tidak dapat mengedit kode anda di portal, termasuk ketika kesalahan sintaks telah terdeteksi. Dalam skenario ini, gunakan Visual Studio Code atau Azure Functions Core Tools untuk mengembangkan dan menerbitkan kode fungsi Anda.

Langkah berikutnya

Jika Anda tidak dapat mengatasi masalah Anda, hubungi tim Azure Functions: