[紀錄] SSH 遠端執行 Python3 程式遭遇 UnicodeEncodeError: ascii codec can’t encode characters 解決方式

lx.chen
2021 年 03 月 04 日 18:03:33 · Fetching Views...
Photo credit: Chris Ried@unsplash

錯誤描述

最近打算用Pycharm Professional從Windows連上Linux伺服器,遠端開發一個Python3程式。

可是,當我使用Pycharm裡面的執行功能,透過SSH遠端執行Linux伺服器上的Python程式的時候,卻噴出以下錯誤:

$ ssh [email protected] "/usr/bin/python3 -u /home/lxchen/projects/test_lib.py"

Traceback (most recent call last):
  File "/home/lxchen/projects/equation-validation/test_lib.py", line 8, in <module>
    print(os.path.exists("/home/lxchen/projects/equation-validation/libs/cwb/../.././data/cwb_data/\u96f2\u6797\u7e23/\u53e3\u6e56\u9109/\u5b9c\u68a7/C0K291/2018-5-1.csv"))
  File "/usr/lib/python3.6/genericpath.py", line 19, in exists
    os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 82-84: ordinal not in range(128)

我Google了一下,發現是Linux伺服器上環境變數 $LANG 是空值導致。奇怪的是只有透過Windows 10的ssh.exe遠端執行Python指令才會造成這種狀況。

要解決這個問題,概念上只要每次在Linux伺服器上執行Python指令前,都把 $LANG 變數設定成 en_US.UTF-8 就行了。

Source: https://stackoverflow.com/questions/17374526/unicodeencodeerror-when-using-python-from-ssh

解決方式

我這邊參考這篇討論,直接寫一個shell script當作python執行檔的Wrapper。建立步驟如下:

1. 在遠端的伺服器上找一個目錄創建一個文字檔,內容如下:

#!/bin/bash -l
export LANG=en_US.UTF-8
/usr/bin/python3 "$@"

檔名命名成 python3-wrap。上述內容的用意是先確保$LANG變數的值是en_US.UTF-8,之後再執行Python。

2. 設定執行權限,執行以下指令:

$ chmod +x ./python3-wrap

3. 回到你的電腦,就可以透過以下指令遠端執行Python3程式了

ssh [email protected] "/路徑/python3-wrap -u  /home/lxchen/projects/test_lib.py"

當然,如果你和我一樣打算遠端使用Pycharm執行Python程式,你只要將Python Interpreter path設定成前面建立的Wrapper就可以了~