背景
CentOS 7.9 默認自帶的 Python 版本為 2.7.x,該版本已于 2020 年 1 月 1 日停止維護,不支持現(xiàn)代 Python 特性(如 f-string 語法),無法直接運行高版本 Python 腳本。此外,Python 2.7 存在安全風險,建議升級到 Python 3(如 3.6 或更高版本)以確保兼容性和安全性。本文檔記錄了在 CentOS 7.9 上升級到 Python 3.6 的過程,解決無法編譯運行高版本 Python 腳本的問題,并配置定時任務以自動化運行腳本。
問題描述
我運行在Ubuntu系統(tǒng)運行成功的 Python 腳本(dify_workflow.py)使用了 f-string 語法(例如 f"Bearer {DIFY_API_KEY}"),該語法僅在 Python 3.6 及以上版本支持。嘗試在 CentOS 7.9 的默認 Python 2.7 環(huán)境下運行時,報錯:
SyntaxError: invalid syntax
此外,腳本依賴 requests 模塊,但 Python 2.7 環(huán)境中未安裝該模塊。嘗試通過 yum 安裝依賴時,遇到網絡問題(Could not resolve host: mirrorlist.centos.org),因為 CentOS 7 已于 2024 年 6 月 30 日達到 EOL,官方鏡像源 mirrorlist.centos.org 失效。
排查與解決方案
以下是排查問題的步驟和最終解決方案。
步驟 1:嘗試使用 Python 2.7 運行腳本
思路:修改腳本以兼容 Python 2.7,替換 f-string 為 .format() 方法,并添加編碼聲明以支持中文字符。
操作:
-
修改腳本(
dy_dify_workflow.py)為 Python 2.7 兼容版本:# -*- coding: utf-8 -*- import requests import json from datetime import datetime DIFY_API_URL = "http://IP/v1/workflows/run" DIFY_API_KEY = "app-aBLQF950nP" def dify_workflow(): headers = { "Authorization": "Bearer {}".format(DIFY_API_KEY), "Content-Type": "application/json" } payload = { "inputs": {}, "response_mode": "blocking", "user": "cron-user" } try: response = requests.post(DIFY_API_URL, headers=headers, json=payload) response.raise_for_status() print u"工作流觸發(fā)成功: {}".format(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) print u"服務器響應: {}".format(response.text) except requests.RequestException as e: print u"工作流觸發(fā)失敗: {}".format(str(e)) if e.response is not None: print u"服務器響應: {}".format(e.response.text) else: print u"無服務器響應,可能為網絡問題" if __name__ == "__main__": dify_workflow() -
保存腳本并確保文件編碼為 UTF-8:
file /home/osadmin/workflow/dy_dify_workflow.py iconv -t UTF-8 /home/osadmin/workflow/dy_dify_workflow.py -o /home/osadmin/workflow/dy_dify_workflow_utf8.py mv /home/osadmin/workflow/dy_dify_workflow_utf8.py /home/osadmin/workflow/dy_dify_workflow.py -
嘗試運行:
python /home/osadmin/workflow/dy_dify_workflow.py
問題:
- 報錯
ImportError: No module named requests,表明缺少requests模塊。 - 嘗試安裝
requests時,yum無法連接到mirrorlist.centos.org。
結論:Python 2.7 雖可通過修改語法兼容腳本,但安裝依賴受限,且長期使用不安全,決定升級到 Python 3.6。
步驟 2:修復 Yum 倉庫配置
思路:由于 CentOS 7 EOL,mirrorlist.centos.org 失效,需將 yum 倉庫切換到歸檔源 vault.centos.org。同時,檢查多個 .repo 文件以解決倉庫沖突。
操作:
-
檢查現(xiàn)有
.repo文件:ls /etc/yum.repos.d/輸出:
CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.repo docker-ce.repo epel.repo epel-testing.repo es.repo發(fā)現(xiàn)多個
.repo文件,可能導致Repository base is listed more than once錯誤。 -
備份
.repo文件:sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ -
創(chuàng)建新的
CentOS-Base.repo:sudo vi /etc/yum.repos.d/CentOS-Base.repo添加:
[base] name=CentOS-$releasever - Base baseurl=http://vault.centos.org/7.9.2009/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$releasever - Updates baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-$releasever - Extras baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 -
創(chuàng)建新的
CentOS-SCLo-scl-rh.repo:sudo vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo添加:
[centos-sclo-rh] name=CentOS-$releasever - SCLo rh baseurl=http://vault.centos.org/7.9.2009/sclo/$basearch/rh/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1 -
禁用第三方倉庫:
sudo yum-config-manager --disable centos-trinasolar docker-ce-stable epel epel-testing es -
清理并重建 Yum 緩存:
sudo yum clean all sudo yum makecache -
驗證倉庫:
sudo yum repolist確認列出
base、updates、extras和centos-sclo-rh。
問題:
-
如果仍報
Could not resolve host,檢查網絡:ping 114.114.114.114 ping vault.centos.org cat /etc/resolv.conf-
確保
/etc/resolv.conf包含:nameserver 8.8.8.8 nameserver 114.114.114.114 -
配置代理(if needed):
sudo vi /etc/yum.conf添加:
proxy=http://<proxy-host>:<proxy-port> proxy_username=<username> proxy_password=<password>
-
步驟 3:安裝 Python 3.6
思路:使用 centos-sclo-rh 倉庫安裝 python36。
操作:
-
安裝 Python 3.6 及其依賴:
sudo yum install -y centos-release-scl sudo yum install -y python36 python36-devel python36-pip -
驗證安裝:
/usr/bin/python3.6 --version /usr/bin/python3.6 -m pip --version輸出示例:
Python 3.6.8 pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
步驟 4:安裝依賴模塊
思路:使用 pip 安裝腳本所需的 requests 模塊。
操作:
-
升級
pip:/usr/bin/python3.6 -m pip install --upgrade pip -
安裝
requests:/usr/bin/python3.6 -m pip install requests -
驗證:
/usr/bin/python3.6 -c "import requests; print(requests.__version__)"輸出示例:
2.31.0。
步驟 5:測試腳本
思路:使用原腳本(支持 f-string),直接在 /usr/bin/python3.6 下運行。
操作:
-
保存腳本到
/home/osadmin/workflow/dy_dify_workflow.py:# -*- coding: utf-8 -*- import requests import json from datetime import datetime DIFY_API_URL = "http://10.12.242.7/v1/workflows/run" DIFY_API_KEY = "app-aBLQcurXYoSx3t3XF1F950nP" def dy_dify_workflow(): headers = { "Authorization": f"Bearer {DIFY_API_KEY}", "Content-Type": "application/json" } payload = { "inputs": {}, "response_mode": "blocking", "user": "cron-user" } try: response = requests.post(DIFY_API_URL, headers=headers, json=payload) response.raise_for_status() print(f"工作流觸發(fā)成功: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print(f"服務器響應: {response.text}") except requests.RequestException as e: print(f"工作流觸發(fā)失敗: {str(e)}") if e.response is not None: print(f"服務器響應: {e.response.text}") else: print("無服務器響應,可能為網絡問題") if __name__ == "__main__": dy_dify_workflow() -
確保文件編碼為 UTF-8:
file /home/osadmin/workflow/dy_dify_workflow.py -
測試運行:
/usr/bin/python3.6 /home/osadmin/workflow/dy_dify_workflow.py
步驟 6:配置定時任務
思路:使用 cron 設置每小時運行腳本。
操作:
-
編輯 crontab:
crontab -e -
添加任務:
0 * * * * /usr/bin/python3.6 /home/osadmin/workflow/dy_dify_workflow.py >> /home/osadmin/workflow/cron.log 2>&1 -
驗證:
crontab -l cat /home/osadmin/workflow/cron.log -
確保權限:
chmod +x /home/osadmin/workflow/dy_dify_workflow.py chown osadmin:osadmin /home/osadmin/workflow/dy_dify_workflow.py
步驟 7:檢查腳本網絡
思路:確保腳本可以訪問目標 URL(http://10.12.242.7)。
操作:
-
測試網絡:
ping 10.12.242.7 curl -I http://10.12.242.7/v1/workflows/run -
如果不通,檢查防火墻或 SELinux:
sudo firewall-cmd --list-all sudo firewall-cmd --add-port=80/tcp --permanent sudo firewall-cmd --reload sudo setenforce 0 # 臨時禁用 SELinux
總結
通過以下步驟,成功解決了 CentOS 7.9 自帶 Python 2.7 無法運行高版本腳本的問題:
- 嘗試修改腳本兼容 Python 2.7,但受限于依賴安裝和安全性問題。
- 修復
yum倉庫,切換到vault.centos.org,并處理多個.repo文件的沖突。 - 安裝 Python 3.6,直接使用
/usr/bin/python3.6運行腳本。 - 安裝
pip和requests模塊。 - 配置 cron 定時任務,自動化運行腳本。
此方案避免了虛擬環(huán)境,直接使用系統(tǒng)級 Python 3.6,簡化了配置,同時確保了腳本的兼容性和穩(wěn)定性。
注意事項
- Python 2.7 風險:繼續(xù)使用 Python 2.7 可能存在安全漏洞,強烈建議長期使用 Python 3.6 或更高版本。
-
網絡維護:定期檢查 DNS 和代理配置,確保
yum可用。 -
日志監(jiān)控:定期查看
/home/osadmin/workflow/cron.log以排查腳本運行問題。
如需進一步優(yōu)化(如使用虛擬環(huán)境或升級到 Python 3.8),可參考如何使用虛擬環(huán)境安裝python環(huán)境。