[英]Local Azure Python: Function No module named 'pyodbc'
我正在嘗試使用 Azure Functions (HttpTrigger) 來讀取我的電子郵件並將它們放入我的 Azure 數據庫中。 為了實現這一點,我開發了一個 python 腳本(readEmail.py 和 raFunctions.py) ,它在 Ubuntu 中的 Visual Studio Code 下本地工作。 我嘗試的下一步是將此腳本轉換為 Azure 函數。 當我嘗試在本地運行 Azure 函數時:
func host start
http://localhost:7071/api/ReadEmail?name=erik
它返回以下錯誤:
Executed 'Functions.ReadEmail' (Failed, Id=4284c861-ce2f-4755-a7e3-94e269a42bc1)
[1/11/20 8:14:43 AM] System.Private.CoreLib: Exception while executing function: Functions.ReadEmail. System.Private.CoreLib: Result: Failure
[1/11/20 8:14:43 AM] Exception: ModuleNotFoundError: No module named 'pyodbc'
[1/11/20 8:14:43 AM] Stack: File "/usr/lib/azure-functions-core-tools/workers/python/3.6/LINUX/X64/azure_functions_worker/dispatcher.py", line 242, in _handle__function_load_request
[1/11/20 8:14:43 AM] func_request.metadata.entry_point)
[1/11/20 8:14:43 AM] File "/usr/lib/azure-functions-core-tools/workers/python/3.6/LINUX/X64/azure_functions_worker/loader.py", line 66, in load_function
[1/11/20 8:14:43 AM] mod = importlib.import_module(fullmodname)
[1/11/20 8:14:43 AM] File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
[1/11/20 8:14:43 AM] return _bootstrap._gcd_import(name[level:], package, level)
[1/11/20 8:14:43 AM] File "/home/webapp/git/RAFunctions/ReadEmail/__init__.py", line 4, in <module>
[1/11/20 8:14:43 AM] import pyodbc
我希望你能在這里幫助我! 我將 python 腳本放在下面的代碼中。
功能文件夾
__init__.py
import logging
import email
import imaplib
import pyodbc
from datetime import datetime
from .readEmail import readEmail
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
responseEmail = readEmail()
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
return func.HttpResponse(f"Hello {responseEmail}!")
else:
return func.HttpResponse(
"Please pass a name on the query string or in the request body",
status_code=400
)
閱讀電子郵件.py
import email
import imaplib
import pyodbc
from datetime import datetime
from .raFunctions import uitvullenDatum
def readEmail():
#Configurations
EMAIL = 'myemail@myemail.com'
PASSWORD = 'mypassword'
SERVER = 'imap.provider.com'
server = 'myserver.database.windows.net'
database = 'mydatabase'
username = 'mydbusername'
password = 'mypassword'
driver= '{ODBC Driver 17 for SQL Server}'
connectionString = 'DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password +';Authentication=ActiveDirectoryPassword'
# Connection settings to Database and Email Server
mail = imaplib.IMAP4_SSL(SERVER)
mail.login(EMAIL, PASSWORD)
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password +';Authentication=ActiveDirectoryPassword')
cursor = cnxn.cursor()
try:
mail.select('inbox')
status, data = mail.search(None, 'ALL')
mail_ids = []
for block in data:
mail_ids += block.split()
for i in mail_ids:
status, data = mail.fetch(i, '(RFC822)')
for response_part in data:
if isinstance(response_part, tuple):
message = email.message_from_bytes(response_part[1])
mail_from = message['From']
mail_subject = message['Subject']
mail_date = message['Date']
if message.is_multipart():
mail_content = ''
for part in message.get_payload():
if part.get_content_type() == 'text/plain':
mail_content += part.get_payload()
else:
mail_content = part.get_payload()
else:
mail_content = message.get_payload()
maildate = email.utils.parsedate(mail_date)
maildate = uitvullenDatum(str(maildate[0]),str(maildate[1]),str(maildate[2]))
values = (maildate, mail_from, mail_subject, mail_content)
sql = "EXEC wp_ra.invoerenmail ?, ?, ?, ?"
cursor.execute(sql, (values))
cursor.commit()
return "Email succesvol ingelezen!"
catch:
return "Fout bij het inlezen van de mail!"
** 要求.txt **
azure-functions
azure-functions-worker
re
datetime
pyodbc
imaplib
email
logging
經過一些幫助,我還嘗試在 python 中創建一個虛擬環境並安裝所有必要的模塊並再次運行 func 主機
python -m venv .venv
source .venv/bin/activate
pip3 install azure, re, pyodbc, imaplib, email, logging
pip3 freeze > requirements.txt
func host start
我現在得到錯誤:
[1/12/20 7:02:34 AM] Executed 'Functions.ReadEmail' (Failed, Id=583e1234-9ad4-477b-b23f-56f53493579d)
[1/12/20 7:02:34 AM] System.Private.CoreLib: Exception while executing function: Functions.ReadEmail. System.Private.CoreLib: Result: Failure
[1/12/20 7:02:34 AM] Exception: SyntaxError: invalid syntax (readEmail.py, line 67)
[1/12/20 7:02:34 AM] Stack: File "/usr/lib/azure-functions-core-tools/workers/python/3.6/LINUX/X64/azure_functions_worker/dispatcher.py", line 242, in _handle__function_load_request
[1/12/20 7:02:34 AM] func_request.metadata.entry_point)
[1/12/20 7:02:34 AM] File "/usr/lib/azure-functions-core-tools/workers/python/3.6/LINUX/X64/azure_functions_worker/loader.py", line 66, in load_function
[1/12/20 7:02:34 AM] mod = importlib.import_module(fullmodname)
[1/12/20 7:02:34 AM] File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
[1/12/20 7:02:34 AM] return _bootstrap._gcd_import(name[level:], package, level)
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 994, in _gcd_import
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 971, in _find_and_load
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 994, in _gcd_import
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 971, in _find_and_load
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap_external>", line 678, in exec_module
[1/12/20 7:02:34 AM] File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[1/12/20 7:02:34 AM] File "/home/webapp/git/RAFunctions/ReadEmail/__init__.py", line 6, in <module>
[1/12/20 7:02:34 AM] from .readEmail import readEmail
您能否嘗試創建一個 Python 虛擬環境並在同一環境中運行該函數。
用於創建環境和激活:
請從您的應用中運行**pip freeze > requirements.txt**
激活后在虛擬環境中安裝所需的庫:
pip install -r requirements.txt
使用**func host start**
運行該函數,看看它是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.