要裝 Python 程式搬到其他主機執行,要先安裝必要套件,慣用做法是用 pip freeze > requirements.txt 指令匯出安裝套件清單,將 requirements.txt 複製到新環境,執行 pip install -r requirements.txt 便可將所需套件一次裝好,讓 Python 程式順利運行。

身為新手,第一次嘗試將在 Windows 開發好的 Python 程式搬進 Linux,就遇上一個小問題。

在 Windows 測完 Python 程式,我用 pip freeze > requirements.txt 匯出 requirements.txt,在 Linux 主機用 pyenv 裝好相同 Python 版本,高高興興跑了 pip install -r requirements.txt,卻冒出以下錯誤:

ERROR: Ignored the following versions that require a different python version: 
1.21.2 Requires-Python >=3.7,<3.11; 
1.21.3 Requires-Python >=3.7,<3.11; 1.21.4 Requires-Python >=3.7,<3.11; 
1.21.5 Requires-Python >=3.7,<3.11; 1.21.6 Requires-Python >=3.7,<3.11
ERROR: Could not find a version that satisfies the requirement pywin32==308 (from versions: none)
ERROR: No matching distribution found for pywin32==308

【題外話】在 Debian/Ubuntu 跑 pyenv install 前需執行以下指令裝好 C 編譯環境:

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev

參考:Install pyenv on Ubuntu and Debian

一開始搞不清楚狀況,誤以為是套件在不同作業系統適用的 Python 版本不同,在 Linux 需要舊一點的 Python 版本,但換了 3.10.15 問題依舊,再看了一下,才發現套件名稱怪怪的 - pywin32?莫非這是 Winodws 專屬?

試著手動將 pywin32 從 requirements.txt 移除,便可順利裝完套件,Python 程式也順利執行。

但覺得不太對,這樣豈不要每種作業系統準備一份專屬的 requirements.txt?應該有更簡便的做法吧?

在 Stackoverflow 找到解法,在套件名稱後方加上 sys_platform 平台條件 ,寫成 pywin32==308;sys_platform=='win32',如此該套件就只會在 Winodws 環境安裝。

不過,再研究了一下,發現整件事算是一場烏龍。

會用到 pywin32 套件是因為我在開發階段要跑 Jupyter Notebook 裝了 jupyter_client 才混進來,後期直接寫 .py 跟部署到 Linux 執行用不到。最後我的做法是刪掉整個 venv 虛擬環境,用 python -m venv venv 重建乾淨的 venv 虛擬環境,這次只裝必要套件再匯出 requirements.txt,想想清掉非必要套件再匯出清單,應是準備部署作業較好的做法。而過程中我也深刻感受到 venv 虛擬環境的方便性,能隔離出不同的套件安裝組合,遇到問題可以快速砍掉重練,學到一些經驗。

同學如對文章提到的 pyenv、venv 一頭霧水,可以參考這篇 Python 新手筆記 1 - 線上教學資源與開發環境

This blog post discusses a common issue when transferring Python applications from Windows to Linux, specifically encountering errors due to platform-specific packages like pywin32. The recommended solution involves using sys_platform conditionals in requirements.txt to specify platform-specific dependencies. Additionally, cleaning up the virtual environment to include only necessary packages before exporting the requirements file is a better approach.


Comments

Be the first to post a comment

Post a comment