本文檔旨在為開發人員解答在使用Python SDK過程中所遇到的常見問題,以提升開發效率。
環境檢查
確保Python語言環境已經正確安裝,Python環境版本 >= 3.7。
確保您的網路能夠訪問阿里雲的API。
問題列表
常見問題與解決方案
問題1:AK傳參問題。
問題現象:代碼運行時報錯,報錯資訊中包含如下資訊時,表示AK未正確地設定阿里雲的憑證(AccessKey)。
V2.0 SDK:AttributeError: 'NoneType' object has no attribute 'get_access_key_id'.
V1.0 SDK:Error:MissingParameter The input parameter "AccessKeyId" that is mandatory for processing this request is not supplied.
解決方案:
執行以下命令,檢查您的環境變數中是否配置有ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET:
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%若返回正確的AccessKey,則說明配置成功。如果返回為空白或錯誤,請嘗試重新設定,具體操作請參見在Linux、macOS和Windows系統配置環境變數。
檢查代碼中AK相關內容是否存在錯誤。
常見的錯誤樣本:
config = open_api_models.Config( access_key_id=os.environ['yourAccessKeyID'], access_key_secret=os.environ['yourAccessKeySecret'] )正確樣本:
config = open_api_models.Config( access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] )說明os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']和os.environ("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),表示是從環境變數中擷取ALIBABA_CLOUD_ACCESS_KEY_ID及ALIBABA_CLOUD_ACCESS_KEY_SECRET的值。
重要切勿直接線上上代碼中明文寫入 AccessKey,該寫法存在安全隱患。
問題2:SDK安裝失敗?
確保使用了正確的Python版本(如Python 3.x)。
使用pip安裝時加上
--upgrade選項,確保安裝最新版本:
pip install --upgrade <SDK_NAME> 如果在安裝過程中遇到許可權問題(比如在系統層級的Python庫路徑下安裝時),可以使用
--user選項,這將SDK安裝到使用者目錄中,而不是系統目錄:
pip install --user <SDK_NAME> 如果你在同一台機器上安裝了多個版本的Python,確保你在使用的Python版本中安裝了SDK。例如,使用
python3而不是python,確保對應的pip也使用了pip3。
問題3:匯入模組失敗,ModuleNotFoundError?
確保SDK已經正確安裝,可以在Python環境下嘗試匯入:
開啟python解譯器
python匯入模組
import <SDK_NAME> 如果沒有任何錯誤,說明SDK已正確安裝。如果出現`ModuleNotFoundError`或`ImportError`,說明SDK未正確安裝。
pip install <SDK_NAME>問題4:AttributeError: 'CredentialModel' object has no attribute 'provider_name'
該錯誤表明代碼中嘗試訪問 CredentialModel 對象的 provider_name 屬性,但運行時發現該屬性不存在。通常是因為依賴的 alibabacloud_credentials 包版本過低,導致運行時類庫與編譯時間使用的 API 不相容。可能的原因包括:
依賴版本過低:當前專案中使用的
alibabacloud_credentials版本較低,而代碼中調用的provider_name屬性屬於較高版本。依賴衝突:專案中可能存在多個版本的
alibabacloud_credentials包,導致運行時載入了錯誤的版本。未正確更新依賴:在升級依賴後,未重新安裝或清理緩衝,導致舊版本仍然被使用。
解決方案:
將
requirements.txt檔案中alibabacloud_credentials依賴項指定為最新版本:alibabacloud_credentials=1.0.1執行
pip install -r requirements.txt --upgrade以更新依賴。說明請查看ChangeLog.txt以擷取alibabacloud_credentials所有發行版本。
檢查依賴衝突。
pip list | grep alibabacloud # 如果發現多個版本,請卸載舊版本並重新安裝最新版本。例如: pip uninstall alibabacloud_credentials pip install alibabacloud_credentials==1.0.1清理緩衝並重新安裝。
pip cache purge pip install -r requirements.txt --force-reinstall
問題5:code: 400, The input parameter"AccesskeyId" that is mandatory for processing this request is not supplied?
引發該錯誤直接原因是發到網關的請求沒有攜帶AccesskeyId。
您需要檢查在使用openapi門戶下載的完整工程時AccesskeyId是否放到了錯誤的位置。應替換main方法下accessKeyId和accessKeySecret兩個字串。

問題6:Tea.exceptions.TeaException: Error: SignatureDoesNotMatch.MissingHeader code: 400, The specified signed header "accept;connection;content-type;host;user-agent;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version" is not found?
引發該錯誤直接原因是自簽名調用服務時通過設定header {"Connection":"close"}以實現短串連,但是V3簽名對此不相容,從而導致報錯。
您可以通過設定:config.signature_algorithm = 'v2'來解決。
問題7:Tea.exceptions.TeaException: Connection aborted?
導致該錯誤的直接原因是請求間隔過長。長串連服務端僅保持30秒,而用戶端則持續保持串連,這導致在經歷30秒的間隔後,請求被服務端斷開,進而導致請求失敗。
設定header {"Connection":"close"}以實現短串連。
可以配置重試,維持在30s內有一次調用。
重試機制在處理多次請求時可能會引發多次業務執行的風險。因此,對於查詢操作的請求,建議配置重試機制;而對於增、刪、改操作的請求,則不建議配置重試。
問題8:調用API逾時,提示:”requests.exceptions.Timeout“或”requests.exceptions.ConnectionError“?
逾時問題可能由多種因素引起,以下是一些常見的原因及相應的解決步驟:
網路連接問題
情況描述:用戶端與伺服器之間的網路不通或網路不穩定導致請求無法到達目標伺服器。
解決方案:
使用ping或curl命令測試本地主機與雲產品Endpoint之間連通性,例如調用傳送簡訊介面逾時時,使用ping dysmsapi.aliyuncs.com或curl -v https://dysmsapi.aliyuncs.com測試連通性。
若命令執行逾時或者無響應,請檢查本地防火牆或路由器中是否有阻斷策略。
若命令有響應,建議設定合理的逾時時間,避免因配置不當導致請求失敗,具體操作請參見逾時機制。範例程式碼如下:
# 對使用RuntimeOptions的請求生效 runtimeOptions = RuntimeOptions( connect_timeout=5000 # 連線逾時 單位毫秒(ms) )
2.API處理時間過長
情況描述:目標API處理請求的時間超過了設定的讀逾時時間。
解決方案:通過配置或增加逾時時間來適應較長的API回應時間, 具體操作請參見逾時機制。例如通過配置讀逾時時間參數來延長當前請求的讀逾時時間,範例程式碼如下:
# 對使用RuntimeOptions的請求生效
runtimeOptions = RuntimeOptions(
read_timeout=10000, # 讀逾時時間 單位毫秒(ms)
)問題9:Linux系統:-bash: python3: command not found?
如果您已安裝了Python,則可能是軟串連沒有配置正確。
軟串連的作用是當使用者訪問軟串連時,實際上訪問的是軟串連指向的目標檔案。比如使用python3實際上指向的是python3.12解譯器。
執行
which python3 pip3尋找當前系統是否存在軟串連,如果存在,需要刪除軟串連。
rm -rf /usr/bin/python3 /usr/bin/pip3重新建立軟串連。找到Python的安裝目錄,進入bin目錄,找到pip3.12和python3.12。執行下面命令建立新軟串連。
sudo ln -s /usr/local/python3/bin/python3.12 /usr/bin/python3
sudo ln -s /usr/local/python3/bin/pip3.12 /usr/bin/pip3問題10:調用API時返回“Invalid parameters”錯誤或”MissingRequiredParameter“類型錯誤?
這裡以調用簡訊服務的傳送簡訊介面為例:
進入OpenAPI門戶的API調試頁面,選擇雲產品和介面。
仔細對比構造的請求對象(如
SendSmsRequest)是否填充了所有必需欄位,例如手機號、簽名等。參考API文檔確認必填項。確保必填參數值正確。
確保填寫的必填參數值正確無誤,例如手機號格式是否符合要求。
在調用 API 前,SDK 會對參數進行自動校正。如果缺少必要參數,您將收到類似
MissingRequiredParameter的錯誤提示。例如,如果手機號參數缺失,會報錯 “MissingPhoneNumbers: code: 400”。

send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
# 需要替換成為您接收簡訊的手機號碼
phone_numbers='<YOUR_VALUE>',
# 需要替換成為您的簡訊簽名
sign_name='<YOUR_VALUE>',
# 需要替換成為您的簡訊模板code
template_code='<YOUR_VALUE>',
# 樣本值:{"code":"1234","name":"1234","time":"1234"}為Json格式
template_param='{"code":"1234","name":"1234","time":"1234"}'
)問題11:API 呼叫失敗,提示地區不支援,報錯”Tea.exceptions.UnretryableException“?
確保您所選地區支援您正在調用的服務。這裡以簡訊服務為例,查看產品的Endpoint可以通過OpenAPI 開發人員門戶的產品首頁中進行尋找確認,請確保填寫正確的Endpoint。

問題12:File "/usr/local/python3/lib/python3.6/site-packages/alibabacloud_slb20140515/client.py", line 4, in <module> from Tea.core import TeaCore ModuleNotFoundError: No module named 'Tea'?
引發該錯誤的原因是由於PIP版本過舊,導致依賴包安裝不完整,或部分依賴包已被刪除。您可以通過升級PIP並再次執行pip install <產品包>來解決此問題,或者安裝缺失的Tea包,使用命令pip install alibabacloud-tea。
遇到此類錯誤時,系統可能會執行 pip install tea以安裝一個不相關的包。請您考慮是否需要刪除該包(可通過 PyPI 查看該包的發布組織或個人)。
問題13:報錯:Command "python setup.py egg_info" failed with error code 1 in xxx?
引發該錯誤的原因是由於Python版本或pip版本過低或者缺少相應的開發庫(擴充包),導致在安裝SDK後無法正常使用。
解決方式:
請檢查您使用的Python版本。
請執行命令
python -V或python3 -V檢查當前Python的版本,若您的Python版本小於3.7,請按照以下步驟升級Python版本。您可以訪問 Python 官網 擷取最新版本的下載連結和安裝說明。若Python版本大於或等於3.7,可能是由於
pip版本過低所導致。請執行命令pip3 install --upgrade pip setuptools以升級到最新版本。然後,再嘗試運行Python代碼。檢查並安裝必要的開發庫。
如果您的Python版本大於等於3.7,更新
pip版本後仍然出現錯誤,問題可能由於缺少某些開發庫引起。在某些情況下,缺少特定的開發庫可能會導致安裝失敗。例如,如果您要安裝numpy,可能需要相關的數學庫如blas和lapack。如果要安裝lxml,則需要安裝libxml2-dev和libxslt1-dev。可以使用如下命令安裝常見的開發庫(以
lxml和numpy為例)sudo yum install libxml2-dev libxslt1-dev -y sudo yum install blas-devel lapack-devel -y說明Python的擴充包(開發庫)是為了增強和擴充Python語言功能而設計的模組或庫。它們提供了額外的工具和方法,使開發人員能夠更輕鬆高效地完成特定任務。具體哪些擴充包是“必須”的,完全取決於您正在開發的具體專案需求。
問題14:報錯:'HTTPSConnectionPool(host='ocr-api.cn-hangzhou.aliyuncs.com', port=443): Max retries exceeded with url: /?Country=Vietnam (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:2418)')))'?
該錯誤通常與 SSL/TLS 協議握手失敗有關,可能的原因包括:
伺服器和用戶端之間的 SSL/TLS 版本不相容。
本地裝置的 SSL 憑證存在問題(例如,認證到期或憑證鏈結不完整)。
網路設定問題導致 SSL 握手失敗。
解決方案:
檢查 SSL/TLS 協議版本:確保本地 Python 環境支援與伺服器通訊所需的 SSL/TLS 版本(例如,伺服器可能僅支援 TLS 1.2)。
import ssl import urllib3 # 建立一個 SSL 上下文,使用 TLS 1.2 ssl_context = ssl.create_urllib3_context(ssl.OP_NO_SSLv2, ssl.OP_NO_SSLv3, ssl.OP_NO_TLSv1, ssl.OP_NO_TLSv1_1) # 初始化 urllib3 池管理器 http = urllib3.PoolManager(context=ssl_context) # 發送請求 response = http.request('GET', 'https://ocr-api.cn-hangzhou.aliyuncs.com/?Country=Vietnam')檢查
Python環境問題:確保
ssl模組和urllib3庫的版本與 Python 版本相容。使用虛擬環境重新安裝 Python 和相關依賴:
python -m venv myenv source myenv/bin/activate pip install requests urllib3 pyOpenSSL檢查網路設定問題,
確保本地防火牆允許 HTTPS 連接埠(443)的流量。
如果使用Proxy 伺服器,確保代理配置正確:
import requests # 使用代理 proxies = { 'http': 'http://your-proxy-server:port', 'https': 'https://your-proxy-server:port' } response = requests.get( 'https://ocr-api.cn-hangzhou.aliyuncs.com/?Country=Vietnam', proxies=proxies )通過升級
requests和urllib3庫來解決問題。pip install --upgrade requests urllib3如果在升級後仍然出現錯誤,則可能是由於環境認證的問題。請設定以下參數以忽略認證,同時調整逾時時間。
# 忽略認證驗證 runtimeOptions = RuntimeOptions( ignore_ssl=True # 忽略對 SSL 憑證的驗證,預設驗證 ) # 調整逾時時間 runtimeOptions = RuntimeOptions( read_timeout=xxx, # 讀逾時時間 單位毫秒(ms) connect_timeout=xxx # 連線逾時 單位毫秒(ms) )若在忽略認證後仍然出現錯誤,請將環境變數
PYTHONHTTPSVERIFY設定為0,以強制忽略 SSL 驗證。export PYTHONHTTPSVERIFY=0 # 忽略 HTTPS 驗證檢查本地 SSL 憑證:確保本地裝置上的 SSL 憑證是最新且完整的。可以使用工具(如
certbot)更新認證或安裝缺失的認證。sudo certbot certonly --standalone --rsa-key-size 4096 --agree-tos --email yo**@email.com
Python基礎錯誤碼自查表
錯誤碼 | 錯誤原因 | 解決方案 |
SyntaxError | 代碼中發現了語法錯誤,通常是拼字錯誤、缺少冒號、括弧不匹配等。 | 檢查代碼,確保文法正確。使用 IDE 或編輯器的文法高亮功能可以協助您找到語法錯誤。 |
NameError | 嘗試使用一個未定義的變數或函數。 | 確保變數或函數的名稱正確,並且已經在代碼的適當位置定義或匯入。 |
TypeError | 操作或函數應用於不相容的物件類型。 | 檢查代碼中的資料類型,確保操作或函數適用於所使用的物件類型。可以使用類型轉換函式來解決類型不符的問題。 |
IndexError | 嘗試訪問列表、元組或字串中不存在的索引。 | 確保索引在對象的有效範圍內。可以使用條件陳述式或異常處理來檢查索引的有效性,或者使用內建的索引檢查函數如 :len()。 |
ValueError | 函數接收到一個無效的參數值。 | 確保提供給函數的參數值符合預期的要求。可以使用條件陳述式或異常處理來驗證參數值的有效性。 |
FileNotFoundError | 嘗試開啟或訪問不存在的檔案。 | 確保指定的檔案路徑正確,並檢查檔案是否存在。可以使用條件陳述式或異常處理來處理檔案不存在的情況。 |
ZeroDivisionError | 試圖進行除法運算時,除數為零。 | 在進行除法運算之前,先確保除數不為零。可以使用條件陳述式或異常處理來檢查除數的值,避免除以零的情況。 |
FloatingPointError | 浮點數計算中出現了無窮大或非數(NaN)的結果。 | 確保進行浮點數計算時,所涉及的數值在有效範圍內。可以使用數值檢查函數來驗證數值的有效性,並在出現異常情況時採取相應的處理措施。 |
OverflowError | 進行數值計算時,結果超出了當前資料類型所能表示的範圍。 | 檢查數值計算中所使用的資料類型,確保它能夠表示運算結果的範圍。如果需要處理大數值,可以使用適當的資料類型或第三方庫來處理。 |
BufferError | 嘗試讀取或寫入超過緩衝區大小的資料。 嘗試訪問不存在的緩衝區。 緩衝區操作導致記憶體溢出或越界。 | 檢查緩衝區大小:確保讀取或寫入的資料量不超過緩衝區的大小。可以使用條件陳述式或異常處理來驗證資料的大小,並在超過緩衝區大小時採取適當的處理措施。 |
EOFError | 嘗試從一個空檔案或檔案末尾讀取資料。 | 檢查檔案內容,確保檔案中有資料可供讀取。如果檔案是空的或已到達檔案末尾,嘗試讀取將引發 EOFError 異常。可以使用條件陳述式或異常處理來檢查檔案內容,並在檔案為空白或到達檔案末尾時採取適當的處理措施。 |
Python SDK異常自查表
錯誤碼 | 錯誤原因 | 解決方案 |
aliyunsdkcore.acs_exception.exceptions.ClientException: SDK.InvalidParameter The parameter region_id not match with ^[a-zA-Z0-9_-]+$ | 填入client初始化的region_id格式錯誤。 | 填入格式cn-<reigon>字串。 |
SDK.InvalidRegionId | 老版本core包遇到無法定址的網域名稱則會報此錯誤。 | 升級aliyun-python-sdk-core包到最新版本,並填入正確regionId。 |
SDK.ServerUnreachable | 網路異常。 | 這個異常在最新版SDK中往往被具體異常取代,例如SDK.HttpError。 請升級aliyun-python-sdk-core到最新版。 |
SDK.MissingEndpointsFiler | 缺少終端點過濾器。 | 配置正確的終端點過濾器,確保其包含正確的設定。 |
SDK.UnknownServerError | 未知的伺服器錯誤。 | 嘗試重新發送請求。 |
SDK.InvalidSessionExpiration | 會話到期時間無效。 | 檢查會話到期時間設定,確保其是有效。如果到期時間已過,需要更新會話或重新擷取會話憑證。 |
SDK.NotSupport | 不支援的功能。 | 確保所使用的 SDK 版本支援所需的功能。 |
SDK.EndpointResolvingError | 服務網域名稱解析錯誤。 | 檢查服務網域名稱解析邏輯,確保能夠正確解析和擷取有效服務網域名稱。 |
SDK.InvalidServerResponse | 伺服器返回的響應無效。 | 檢查伺服器返回的響應內容,確保其符合阿里雲服務的要求。您可以查看響應內容以擷取更多資訊,並根據需要進行調整。 |
RequiredArgumentException | 必填參數缺失。 | 確保填寫必填參數正確值即可。 |
UnretryableException | 網路異常。 | 1. 檢查網域名稱 endpoint是否正確。 2. ping curl 網域名稱,檢查網路是否通暢。 |
支援人員
以上問題的解決方案旨在協助您更友好地使用阿里雲SDK。如果您在使用過程中遇到其他問題,請通過以下方式與我們聯絡:
提交工單:阿里雲提交工單頁面。