CentOS 7.9 升級 Python 3.6 以運行高版本 Python 腳本

背景

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() 方法,并添加編碼聲明以支持中文字符。

操作

  1. 修改腳本(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()
    
    
  2. 保存腳本并確保文件編碼為 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
    
    
  3. 嘗試運行:

    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 文件以解決倉庫沖突。

操作

  1. 檢查現(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 錯誤。

  2. 備份 .repo 文件

    sudo mkdir /etc/yum.repos.d/backup
    sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
    
    
  3. 創(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
    
    
  4. 創(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
    
    
  5. 禁用第三方倉庫

    sudo yum-config-manager --disable centos-trinasolar docker-ce-stable epel epel-testing es
    
    
  6. 清理并重建 Yum 緩存

    sudo yum clean all
    sudo yum makecache
    
    
  7. 驗證倉庫

    sudo yum repolist
    
    

    確認列出 base、updates、extrascentos-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

操作

  1. 安裝 Python 3.6 及其依賴:

    sudo yum install -y centos-release-scl
    sudo yum install -y python36 python36-devel python36-pip
    
    
  2. 驗證安裝:

    /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 模塊。

操作

  1. 升級 pip

    /usr/bin/python3.6 -m pip install --upgrade pip
    
    
  2. 安裝 requests

    /usr/bin/python3.6 -m pip install requests
    
    
  3. 驗證:

    /usr/bin/python3.6 -c "import requests; print(requests.__version__)"
    
    

    輸出示例:2.31.0。

步驟 5:測試腳本

思路:使用原腳本(支持 f-string),直接在 /usr/bin/python3.6 下運行。

操作

  1. 保存腳本到 /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()
    
    
  2. 確保文件編碼為 UTF-8:

    file /home/osadmin/workflow/dy_dify_workflow.py
    
    
  3. 測試運行:

    /usr/bin/python3.6 /home/osadmin/workflow/dy_dify_workflow.py
    
    

步驟 6:配置定時任務

思路:使用 cron 設置每小時運行腳本。

操作

  1. 編輯 crontab:

    crontab -e
    
    
  2. 添加任務:

    0 * * * * /usr/bin/python3.6 /home/osadmin/workflow/dy_dify_workflow.py >> /home/osadmin/workflow/cron.log 2>&1
    
    
  3. 驗證:

    crontab -l
    cat /home/osadmin/workflow/cron.log
    
    
  4. 確保權限:

    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)。

操作

  1. 測試網絡:

    ping 10.12.242.7
    curl -I http://10.12.242.7/v1/workflows/run
    
    
  2. 如果不通,檢查防火墻或 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 無法運行高版本腳本的問題:

  1. 嘗試修改腳本兼容 Python 2.7,但受限于依賴安裝和安全性問題。
  2. 修復 yum 倉庫,切換到 vault.centos.org,并處理多個 .repo 文件的沖突。
  3. 安裝 Python 3.6,直接使用 /usr/bin/python3.6 運行腳本。
  4. 安裝 piprequests 模塊。
  5. 配置 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)境。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容