“/usr/bin/env: ‘python\r’: そのようなファイルやディレクトリはありません”と表示されたとき 【Raspberry Pi】

Raspberry Pi

Windows で作成した Python のスクリプトを Raspberry Pi (Linux) に移植したところ、冒頭のエラーが出ました。
異なる OS 間でスクリプトを移植した際に生じる典型的なエラーについて、現象と対処方法をまとめておきます。

環境:
・ Windows パソコン、Python 3.X
・ Raspberry Pi 3 model B+、buster、Python 3.X

背景

Python には標準で、Webサーバーの機能があります。
先日、Windows で Webサーバーのスクリプトを作成し、スタンドアロンで Webアプリが動くようになりました。
1台のパソコン上ではうまく動いたので、さらに発展させたいところです。

具体的には、自宅内のネットワークにつなげた Linux (Raspberry Pi) にこのスクリプトを移植して Webサーバー化し、Windows など他のパソコンからアクセスできるようにすることで、Webアプリを運用、発展させていきたいところです。

そこで、Windows で動いていた Python のスクリプトを Linux に移したところ、いくつかのエラーが出ました。
設定の修正等をしたところ、自宅内で Webサーバーが動くようになりましたので、ポイントをまとめておきます。

なお、テストに使ったサンプルは、末尾の関連リンクで作成していたスクリプト(簡易計算機)などです。

エラー表示と対処方法

現象1: ブラウザから Webサーバーにアクセスすると 403 エラーが出る

手順概要
① Raspberry Pi 上でドキュメントルート(公開フォルダ)として使用するフォルダを作成する。
例: /home/pi/web_server1/
② このフォルダにさらに cgi-bin という名前でフォルダを作成し、cgi-bin 内に Windows で作成した Python のスクリプト(★.py)をコピーする。
例:/home/pi/web_server1/cgi-bin/calc1.py
③ Raspberry Pi のコンソールを起動し、ドキュメントルートに移動して、Web サーバーを起動する。
cd home/pi/web_server1/
python3 -m http.server 8000 –cgi
④ Webサーバーの起動後、ローカルネットワーク内で接続されている Windows パソコンの Microsoft Edge ブラウザから、”192.168.x.x:8000/cgi-bin/★.py” (アドレス等は参考例)にアクセスする。

結果
以下のエラーが表示される。
① Web サーバー 側(Raspberry Pi, Linux) の表示
code 403, message CGI script is not executable (‘/cgi-bin/★.py’ ) ”
② ブラウザ側(Windows パソコン, Microsoft Edge)の表示
Error response
Error code: 403
Message: CGI script is not executable (‘/cgi-bin/★.py’ ).
Error code explanation: HTTPStatus.FORBIDDEN – Request forbidden — authorization will not help.

原因
スクリプト(★.py)を実行する権限がクライアント(Windows)側に与えられていない。そのため、cgi を実行できない。
対処方法
① cgi-bin フォルダに移動して、ls -al を実行してファイルと権限を確認する。
② ”chmod 755 ★.py” を実行し、実行権限を設定する。
③ ls -al を実行して権限が修正されたことを確認した後、再度、ブラウザで Web サーバーにアクセスして動作を確認する。

現象2: Webサーバーにアクセスすると、”/usr/bin/env: ‘python\r’: そのようなファイルやディレクトリはありません”のエラーが出る

原因
Windows の改行コードが Linux の改行コードとは異なるため、Python のスクリプトが正常に読み込めない。

対処方法
① Raspberry Pi の cgi-bin フォルダ内で、新たにテキストファイルを作る。
② そのテキストファイルに、Windows から移植したスクリプトファイル(★.py)の内容をコピー&ペーストし、ファイル名も変更してファイルを差し替える。
③ 再度、ブラウザで Webサーバーにアクセスして、動作するかどうかを確認する。

→ Python のスクリプト(Webサーバー)が正常に動作しました! (私の環境では)

まとめ

Python のスクリプトを Windows から Linux に移植したとき、よく生じるエラーと対処方法についてまとめました。
「そのようなファイル…はありません」という表現が不正確だと思います。エラー表示を見たとき、ロジカルに矛盾しているため、余計な混乱を招くと思います。
「そのようなファイル…にアクセスできません/読み込めません」なら、対処方法がイメージしやすいのですけれども。。

関連リンク
・ ファイルがあるのに “FileNotFoundError” と出るとき 【Raspberry Pi】
・ 
エラーコードのまとめ 【Webサーバー】
・ Webサーバーで動く Python アプリ 【Windows】

タイトルとURLをコピーしました