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:
Khusus dengan model v2, berikut adalah beberapa masalah yang diketahui dan solusinya:
Panduan pemecahan masalah umum untuk Python Functions meliputi:
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:
- Paket tidak ditemukan
- Paket tidak diselesaikan dengan roda Linux yang tepat
- Paket ini tidak kompatibel dengan versi penerjemah Python
- Paket berkonflik dengan paket lain
- Paket hanya mendukung platform Windows dan macOS
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 ke1
, bukahttps://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages
dan unduh file dari URL terbaruhref
. - Jika aplikasi fungsi tidak memiliki salah satu pengaturan aplikasi sebelumnya, buka
https://<app-name>.scm.azurewebsites.net/api/settings
dan temukan URL di bawahSCM_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.7
Python :: 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.7
Python :: 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:
- Penerjemah Python tidak sesuai arsitektur OS
- Penerjemah Python tidak didukung oleh Azure Functions Python Worker
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:
.azure-functions-core-tools
Temukan jalur dengan menjalankan:func GetExtensionBundlePath
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 olehArchiveFiles
tugas.
Masalah pengembangan di portal Azure
Saat menggunakan portal Azure, mempertimbangkan masalah yang diketahui ini dan solusinya:
- Ada batasan umum untuk menulis kode fungsi Anda di portal. Untuk informasi selengkapnya, lihat Batasan pengembangan di portal Azure.
- 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: