Azure İşlevleri'nde Python hatalarını giderme
Bu makalede, Azure İşlevleri Python işlevlerinizle ilgili hataları gidermenize yardımcı olacak bilgiler sağlanır. Bu makale hem v1 hem de v2 programlama modellerini destekler. Makalenin üst kısmındaki seçiciden kullanmak istediğiniz modeli seçin.
Not
Python v2 programlama modeli yalnızca 4.x işlevleri çalışma zamanında desteklenir. Daha fazla bilgi için bkz. Azure İşlevleri çalışma zamanı sürümlerine genel bakış.
Python işlevlerindeki yaygın sorunlar için sorun giderme bölümleri şunlardır:
Özellikle v2 modelinde bilinen bazı sorunlar ve bunların geçici çözümleri şunlardır:
Python İşlevleri için genel sorun giderme kılavuzları şunlardır:
Sorun giderme: ModuleNotFoundError
Bu bölüm, Python işlev uygulamanızda modülle ilgili hataları gidermenize yardımcı olur. Bu hatalar genellikle aşağıdaki Azure İşlevleri hata iletisiyle sonuçlanır:
Özel durum: ModuleNotFoundError: 'module_name' adlı modül yok.
Bu hata, bir Python işlev uygulaması Python modülünü yükleyemediğinde oluşur. Bu hatanın kök nedeni aşağıdaki sorunlardan biridir:
- Paket bulunamıyor
- Paket düzgün Linux tekerleği ile çözümlenmedi
- Paket Python yorumlayıcı sürümüyle uyumlu değil
- Paket diğer paketlerle çakişer
- Paket yalnızca Windows ve macOS platformlarını destekler
Proje dosyalarını görüntüleme
Sorununuzun gerçek nedenini belirlemek için işlev uygulamanızda çalışan Python proje dosyalarını almanız gerekir. Proje dosyalarınız yerel bilgisayarınızda yoksa, bunları aşağıdaki yollardan biriyle alabilirsiniz:
- İşlev uygulamasının bir
WEBSITE_RUN_FROM_PACKAGE
uygulama ayarı varsa ve değeri bir URL ise, URL'yi kopyalayıp tarayıcınıza yapıştırarak dosyayı indirin. - İşlev uygulaması
WEBSITE_RUN_FROM_PACKAGE
olarak1
ayarlandıysa adresine gidinhttps://<app-name>.scm.azurewebsites.net/api/vfs/data/SitePackages
ve dosyayı en sonhref
URL'den indirin. - İşlev uygulamasında önceki uygulama ayarlarından biri yoksa adresine gidin
https://<app-name>.scm.azurewebsites.net/api/settings
ve altındaSCM_RUN_FROM_PACKAGE
URL'yi bulun. URL'yi kopyalayıp tarayıcınıza yapıştırarak dosyayı indirin. - Öneriler sorunu çözerse adresine gidin
https://<app-name>.scm.azurewebsites.net/DebugConsole
ve altındaki/home/site/wwwroot
içeriği görüntüleyin.
Bu makalenin geri kalanı işlev uygulamanızın içeriğini inceleyerek, kök nedenini belirleyerek ve belirli bir sorunu çözerek bu hatanın olası nedenlerini gidermenize yardımcı olur.
ModuleNotFoundError Tanılama
Bu bölümde modülle ilgili hataların olası kök nedenleri açıklanır. Olası kök nedenin hangisi olduğunu anladıktan sonra ilgili azaltmaya gidebilirsiniz.
Paket bulunamıyor
veya .python_packages/lib/site-packages/<package-name>
adresine .python_packages/lib/python3.6/site-packages/<package-name>
gidin. Dosya yolu yoksa, bu eksik yol büyük olasılıkla kök nedendir.
Dağıtım sırasında üçüncü taraf veya eski araçların kullanılması bu soruna neden olabilir.
Bu sorunu azaltmak için bkz . Uzak derlemeyi etkinleştirme veya Yerel bağımlılıkları derleme.
Paket doğru Linux tekerleği ile çözümlenmez
veya .python_packages/lib/site-packages/<package-name>-<version>-dist-info
adresine .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
gidin. Sık kullandığınız metin düzenleyiciyi kullanarak tekerlek dosyasını açın ve Etiket: bölümünü denetleyin. Sorun, etiket değerinin Linux içermemesi olabilir.
Python işlevleri yalnızca Azure'da Linux üzerinde çalışır. İşlevler çalışma zamanı v2.x, Debian Stretch üzerinde, v3.x çalışma zamanı ise Debian Buster üzerinde çalışır. Yapıtın doğru Linux ikili dosyalarını içermesi beklenir. Core Tools, üçüncü taraf veya eski araçlarda bayrağını kullandığınızda --build local
, bu eski ikili dosyaların kullanılmasına neden olabilir.
Sorunu azaltmak için bkz . Uzaktan derlemeyi etkinleştirme veya Yerel bağımlılıkları derleme.
Paket Python yorumlayıcı sürümüyle uyumlu değil
veya .python_packages/lib/site-packages/<package-name>-<version>-dist-info
adresine .python_packages/lib/python3.6/site-packages/<package-name>-<version>-dist-info
gidin. Metin düzenleyicinizde METADATA dosyasını açın ve Sınıflandırıcılar: bölümünü denetleyin. Bölümünde Python :: 3
, , Python :: 3.6
, Python :: 3.7
, Python :: 3.8
veya Python :: 3.9
yoksa paket sürümü çok eski veya daha büyük olasılıkla bakım dışıdır.
İşlev uygulamanızın Python sürümünü Azure portalından de kontrol edebilirsiniz. Çalışma zamanı sürümünü bulmak için işlev uygulamanızın Genel Bakış kaynak sayfasına gidin. Çalışma zamanı sürümü, Azure İşlevleri çalışma zamanı sürümlerine genel bakış bölümünde açıklandığı gibi Python sürümlerini destekler.
Sorunu azaltmak için bkz . Paketinizi en son sürüme güncelleştirme veya Paketi eşdeğerleriyle değiştirme.
Paket diğer paketlerle çakişer
Paketin doğru Linux tekerlekleriyle doğru çözümlendiğini doğruladıysanız, diğer paketlerle çakışma olabilir. Bazı paketlerde PyPi belgeleri uyumsuz modülleri netleştirebilir. Örneğin, içinde azure 4.0.0
aşağıdaki deyimi bulursunuz:
Bu paket azure-storage ile uyumlu değildir. azure-storage'ı yüklediyseniz veya azure 1.x/2.x'i yüklediyseniz ve azure-storage'ı kaldırmadıysanız, önce azure-storage'ı kaldırmanız gerekir.
Paket sürümünüzle ilgili belgeleri içinde https://pypi.org/project/<package-name>/<package-version>
bulabilirsiniz.
Sorunu azaltmak için bkz . Paketinizi en son sürüme güncelleştirme veya Paketi eşdeğerleriyle değiştirme.
Paket yalnızca Windows ve macOS platformlarını destekler
requirements.txt
öğesini bir metin düzenleyicisiyle açın ve içinde https://pypi.org/project/<package-name>
paketi denetleyin. Bazı paketler yalnızca Windows ve macOS platformlarında çalışır. Örneğin, pywin32 yalnızca Windows üzerinde çalışır.
Yerel Module Not Found
geliştirme için Windows veya macOS kullanırken hata oluşmayabilir. Ancak paket, çalışma zamanında Linux kullanan Azure İşlevleri içeri aktarılamıyor. Bu sorun, projenin başlatılması sırasında kullanarak pip freeze
sanal ortamı Windows veya macOS makinenizden requirements.txt dışarı aktarma işleminden kaynaklanabilir.
Sorunu azaltmak için bkz . Paketi eşdeğerlerle değiştirme veya El sanatları requirements.txt.
ModuleNotFoundError'ı Azaltma
Modülle ilgili sorunlar için olası risk azaltma işlemleri aşağıda verilmiştir. Bu risk azaltmalarından hangisinin deneneceğini belirlemek için daha önce bahsedilen tanılamaları kullanın.
Uzak derlemeyi etkinleştirme
Uzak derlemenin etkinleştirildiğinden emin olun. Emin olmanız gereken yol, dağıtım yönteminize bağlıdır.
Visual Studio Code için Azure İşlevleri uzantısının en son sürümünün yüklendiğinden emin olun. .vscode/settings.json dosyasının mevcut olduğunu ve ayarını "azureFunctions.scmDoBuildDuringDeployment": true
içerdiğini doğrulayın. Etkinleştirilmezse, ayar etkin olarak dosyayı azureFunctions.scmDoBuildDuringDeployment
oluşturun ve projeyi yeniden dağıtın.
Yerel bağımlılıklar oluşturma
Hem Docker hem de Azure İşlevleri Core Tools'un en son sürümlerinin yüklendiğinden emin olun. Yerel işlev proje klasörünüze gidin ve dağıtım için kullanın func azure functionapp publish <app-name> --build-native-deps
.
Paketinizi en son sürüme güncelleştirme
öğesinin en son paket sürümünde https://pypi.org/project/<package-name>
Sınıflandırıcılar: bölümünü denetleyin. Paket, veya ile uyumlu POSIX
veya POSIX :: Linux
İşletim Sistemi'nde olmalıdırOS Independent
. Ayrıca, programlama dili şunları içermelidir: Python :: 3
, Python :: 3.6
, Python :: 3.7
, Python :: 3.8
veya Python :: 3.9
.
Bu paket öğeleri doğruysa, requirements.txt satırını <package-name>~=<latest-version>
değiştirerek paketi en son sürüme güncelleştirebilirsiniz.
El sanatları requirements.txt
Bazı geliştiriciler, geliştirme ortamları için Python paketlerinin listesini oluşturmak için kullanır pip freeze > requirements.txt
. Bu kolaylık çoğu durumda işe yarasa da, Windows veya macOS'ta yerel olarak işlev geliştirme, ancak Linux üzerinde çalışan bir işlev uygulamasında yayımlama gibi platformlar arası dağıtım senaryolarında sorunlar olabilir. Bu senaryoda, pip freeze
yerel geliştirme ortamınız için beklenmeyen işletim sistemine özgü bağımlılıklar veya bağımlılıklar oluşturabilir. Bu bağımlılıklar, Linux üzerinde çalışırken Python işlev uygulamasını bozabilir.
En iyi yöntem, proje kaynak kodunuzdaki her .py dosyasından içeri aktarma deyimini denetlemek ve ardından yalnızca requirements.txt dosyasındaki modülleri iade etmektir. Bu uygulama, paketlerin çözümünün farklı işletim sistemlerinde düzgün bir şekilde işlenebileceğini garanti eder.
Paketi eşdeğerlerle değiştirme
İlk olarak, içindeki paketin https://pypi.org/project/<package-name>
en son sürümüne göz atın. Bu paketin genellikle kendi GitHub sayfası vardır. GitHub'da Sorunlar bölümüne gidin ve sorununuzun düzeltilip giderildiğini görmek için arama yapın. Düzeltildiyse paketi en son sürüme güncelleştirin.
Bazen paket Python Standart Kitaplığı ile (örneğinpathlib
) tümleştirilmiş olabilir. Bu durumda, Azure İşlevleri belirli bir Python dağıtımı sağladığımız için (Python 3.6, Python 3.7, Python 3.8 ve Python 3.9), requirements.txt dosyanızdaki paket kaldırılmalıdır.
Ancak, sorunun düzeltilmediğini ve son tarihe ulaşıldığını fark ederseniz, projeniz için benzer bir paket bulmak için biraz araştırma yapmanızı öneririz. Python topluluğu genellikle kullanabileceğiniz çok çeşitli benzer kitaplıklar sunar.
Bağımlılık yalıtımı bayrağını devre dışı bırakma
PYTHON_ISOLATE_WORKER_DEPENDENCIES uygulama ayarını değerine 0
ayarlayın.
Sorun giderme: 'cygrpc' içeri aktarılamıyor
Bu bölüm, Python işlev uygulamanızdaki 'cygrpc' ile ilgili hataları gidermenize yardımcı olur. Bu hatalar genellikle aşağıdaki Azure İşlevleri hata iletisiyle sonuçlanır:
'cygrpc' adı 'grpc._cython' içinden içeri aktarılamıyor
Bu hata, bir Python işlev uygulaması düzgün bir Python yorumlayıcısıyla başlayamazsa oluşur. Bu hatanın kök nedeni aşağıdaki sorunlardan biridir:
- Python yorumlayıcısı işletim sistemi mimarisini yanlış algılar
- Python yorumlayıcısı Azure İşlevleri Python Çalışanı tarafından desteklenmiyor
'cygrpc' başvuru hatasını tanılama
Başvuruda bulunan hataların cygrpc
çeşitli olası nedenleri vardır ve bunlar bu bölümde ayrıntılı olarak anlatılmıştır.
Python yorumlayıcısı işletim sistemi mimarisini yanlış algılar
Bu uyuşmazlık büyük olasılıkla 64 bit işletim sisteminizde yüklü olan 32 bit Python yorumlayıcıdan kaynaklanır.
x64 işletim sisteminde çalışıyorsanız Python sürüm 3.6, 3.7, 3.8 veya 3.9 yorumlayıcınızın da 64 bit sürümde olduğundan emin olun.
Aşağıdaki komutları çalıştırarak Python yorumlayıcınızın bitliğini de kontrol edebilirsiniz:
PowerShell'de Windows'ta komutunu çalıştırın py -c 'import platform; print(platform.architecture()[0])'
.
Unix benzeri bir kabuk üzerinde komutunu çalıştırın python3 -c 'import platform; print(platform.architecture()[0])'
.
Python yorumlayıcı bitliği ile işletim sistemi mimarisi arasında bir uyuşmazlık varsa Python Software Foundation'dan uygun bir Python yorumlayıcısı indirin.
Python yorumlayıcısı Azure İşlevleri Python Çalışanı tarafından desteklenmiyor
Azure İşlevleri Python Çalışanı yalnızca belirli Python sürümlerini destekler.
Python yorumlayıcınızın Windows'da veya python3 --version
Unix benzeri sistemlerde beklenen sürümünüzle py --version
eşleşip eşleşmediğini denetleyin. Döndürülen sonucun desteklenen Python sürümlerinden biri olduğundan emin olun.
Python yorumlayıcı sürümünüz Azure İşlevleri gereksinimlerini karşılamıyorsa Python Software Foundation'dan İşlevler tarafından desteklenen bir Python yorumlayıcı sürümü indirin.
Sorun giderme: Python'dan 137 koduyla çıkıldı
Kod 137 hataları genellikle Python işlev uygulamanızdaki yetersiz bellek sorunlarından kaynaklanıyor. Sonuç olarak, aşağıdaki Azure İşlevleri hata iletisini alırsınız:
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python 137 koduyla çıktı
Bu hata, bir Python işlev uygulaması işletim sistemi tarafından bir SIGKILL
sinyalle sonlandırmaya zorlandığında oluşur. Bu sinyal genellikle Python işleminizde bellek yetersiz hatası olduğunu gösterir. Azure İşlevleri platformu, bu sınırı aşan tüm işlev uygulamalarını sonlandıran bir hizmet sınırlaması vardır.
İşlev uygulamanızdaki bellek sorunlarını analiz etmek için bkz . Yerel geliştirme ortamında Python işlev uygulamasının profilini oluşturma.
Sorun giderme: Python'dan 139 koduyla çıkıldı
Bu bölüm, Python işlev uygulamanızdaki segmentasyon hatası hatalarını gidermenize yardımcı olur. Bu hatalar genellikle aşağıdaki Azure İşlevleri hata iletisiyle sonuçlanır:
Microsoft.Azure.WebJobs.Script.Workers.WorkerProcessExitException : python 139 koduyla çıktı
Bu hata, bir Python işlev uygulaması işletim sistemi tarafından bir SIGSEGV
sinyalle sonlandırmaya zorlandığında oluşur. Bu sinyal, bellek segmentasyonunun ihlalini gösterir ve bu da kısıtlanmış bir bellek bölgesinden beklenmeyen bir okuma veya yazma işleminden kaynaklanabilir. Aşağıdaki bölümlerde yaygın kök nedenlerin bir listesini sağlıyoruz.
Üçüncü taraf paketlerden bir regresyon
İşlev uygulamanızın requirements.txt dosyasında, her Azure dağıtımı sırasında sabitlenmemiş bir paket en son sürüme yükseltilir. Paket güncelleştirmeleri, uygulamanızı etkileyen regresyonlara neden olabilir. Bu tür sorunlardan kurtarmak için içeri aktarma deyimlerini açıklama satırı yapma, paket başvurularını devre dışı bırakma veya paketi requirements.txt önceki bir sürüme sabitleme.
Yanlış biçimlendirilmiş bir .pkl dosyasından seçim kaldırma
İşlev uygulamanız bir .pkl dosyasından Python nesnesi yüklemek için Python pickle kitaplığını kullanıyorsa, dosyada hatalı biçimlendirilmiş bayt dizesi veya geçersiz bir adres başvurusu olabilir. Bu sorundan kurtulmak için işleve pickle.load()
açıklama eklemeyi deneyin.
Pyodbc bağlantı çakışması
İşlev uygulamanız popüler ODBC veritabanı sürücüsü pyodbc kullanıyorsa, tek bir işlev uygulamasında birden çok bağlantı açık olabilir. Bu sorunu önlemek için tekil deseni kullanın ve işlev uygulaması genelinde yalnızca bir pyodbc bağlantısı kullanıldığından emin olun.
Eşitleme tetikleyicileri başarısız oldu
Hataya Sync triggers failed
çeşitli sorunlar neden olabilir. Olası nedenlerden biri, işlevleriniz bir App Service planında çalıştırıldığında müşteri tanımlı bağımlılıklarla Python yerleşik modülleri arasındaki çakışmadır. Daha fazla bilgi için bkz . Paket yönetimi.
Sorun giderme: dosya veya derleme yüklenemedi
Bu hatayı, v2 programlama modelini kullanarak yerel olarak çalıştırırken görebilirsiniz. Bu hatanın nedeni, gelecek sürümde çözülecek bilinen bir sorundur.
Bu, bu hata için örnek bir iletidir:
DurableTask.Netherite.AzureFunctions: 'Microsoft.Azure.WebJobs.Extensions.DurableTask, Version=2.0.0.0, Culture=neutral, PublicKeyToken=014045d636e89289' dosyası veya derlemesi yüklenemedi.
Sistem belirtilen dosyayı bulamıyor.
Uzantı paketinin önbelleğe alınma şekliyle ilgili bir sorun nedeniyle hata oluşur. Sorunu gidermek için, diğer ayrıntıları görmek için şu komutu ile --verbose
çalıştırın:
func host start --verbose
Gibi bir uzantı yükleme günlüğü Loading startup extension <>
izlenmiyorsa Loaded extension <>
büyük olasılıkla bu önbelleğe alma sorununu görüyorsunuzdur.
Bu sorunu çözmek için:
.azure-functions-core-tools
Komutunu çalıştırarak yolu bulun:func GetExtensionBundlePath
.azure-functions-core-tools
Dizini silin.rm -r <insert path>/.azure-functions-core-tools
Önbellek dizini, Core Tools'u yeniden çalıştırdığınızda yeniden oluşturulur.
Sorun giderme: Azure Depolama bağlantısı çözümlenemiyor
Bu hatayı yerel çıkışınızda aşağıdaki ileti olarak görebilirsiniz:
Microsoft.Azure.WebJobs.Extensions.DurableTask: 'Storage' adlı Azure Depolama bağlantısı çözümlenemiyor.
Değer null olamaz. (Parametre 'provider')
Bu hata, uzantıların paketten yerel olarak nasıl yüklendiğinin bir sonucudur. Bu hatayı çözmek için aşağıdaki eylemlerden birini gerçekleştirin:
Azurite gibi bir depolama öykünücüsü kullanın. İşlev uygulamanızda depolama hesabı kullanmayı planlamıyorsanız bu seçenek iyi bir seçenektir.
Depolama hesabı oluşturun ve localsettings.json dosyasındaki
AzureWebJobsStorage
ortam değişkenine bir bağlantı dizesi ekleyin. Uygulamanızda bir depolama hesabı tetikleyicisi veya bağlaması kullanırken ya da mevcut bir depolama hesabınız varsa bu seçeneği kullanın. Başlamak için bkz. Depolama hesabı oluşturma.
Dağıtımdan sonra işlevler bulunamadı
Python işlevlerinin, görünüşe göre başarılı bir dağıtımdan sonra konak tarafından bulunmamasına neden olabilecek bazı yaygın derleme sorunları vardır:
Paketlerin derleme adımından doğru şekilde geri yüklendiğini garanti etmek için aracı havuzunun Ubuntu üzerinde çalışıyor olması gerekir. Dağıtım şablonunuzun derleme ve dağıtım için bir Ubuntu ortamı gerektirdiğine emin olun.
İşlev uygulaması kaynak deponun kökünde olmadığında, adımın
pip install
klasörü oluşturmak için doğru konuma başvurduğundan.python_packages
emin olun. Bu konumun büyük/küçük harfe duyarlı olduğunu unutmayın, örneğin şu komut örneğinde:pip install --target="./FunctionApp1/.python_packages/lib/site-packages" -r ./FunctionApp1/requirements.txt
Şablonun içine
/home/site/wwwroot
yüklenebilen bir dağıtım paketi oluşturması gerekir. Azure Pipelines'da bu işlem görev tarafındanArchiveFiles
gerçekleştirilir.
Azure portalında geliştirme sorunları
Azure portalını kullanırken şu bilinen sorunları ve bunların geçici çözümlerini dikkate alın:
- İşlev kodunuzu portalda yazmak için genel sınırlamalar vardır. Daha fazla bilgi için bkz . Azure portalında geliştirme sınırlamaları.
- Portaldaki bir işlev uygulamasından bir işlevi silmek için işlev kodunu dosyanın kendisinden kaldırın. Sil düğmesi, Python v2 programlama modeli kullanılırken işlevi kaldırmak için çalışmaz.
- Portalda işlev oluştururken geliştirme için farklı bir araç kullanmanız gerekebilir. Bir söz dizimi hatasının algılandığı durumlar da dahil olmak üzere kodunuzu portalda düzenleyememenize neden olan çeşitli senaryolar vardır. Bu senaryolarda, işlev kodunuzu geliştirmek ve yayımlamak için Visual Studio Code veya Azure İşlevleri Core Tools kullanın.
Sonraki adımlar
Sorununuzu çözemiyorsanız Azure İşlevleri ekibine başvurun: