改行コード

Pythonのプログラムは基本的にはOSに依存しないので、使い慣れたWindowsのエディタでコードを書き、確認してからRaspberry Piに持って行くというのは有効なのだが、そこにもちょっとした罠があったりする。

こんなプログラムをWindowsで書いたとしよう。

#!/usr/bin/env python

print 'Hello Raspberry Pi World!'

このファイルをRaspberry Piに持って行き、pythonの引数として実行した場合はもちろんちゃんと実行される。

pi@raspberrypi ~/PythonProjects $ python helloworld.py
Hello Raspberry Pi World!

しかし、このソースファイルに実行属性を付けて実行しようとすると、こうなってしまう場合がある。

pi@raspberrypi ~/PythonProjects $ chmod +x helloworld.py
pi@raspberrypi ~/PythonProjects $ ./helloworld.py
: No such file or directory

このファイルを file コマンドで調べると、以下のように表示される。

pi@raspberrypi ~/PythonProjects $ file helloworld.py
helloworld.py: Python script, ASCII text executable, with CRLF line terminators

Linuxのテキストファイルは改行コードがLFのみだが、WindowsはCR+LFがデフォルト。これをPythonで実行した場合は、どちらの改行コードでも正しく実行されるのだが、実行属性を付けた場合はシェルがファイルの一行目を見てどうやって実行すれば良いのか判断するので、改行コードが違うと正しく認識されなくなるのだ。

シェルは’python’+CRをファイル名と見なすため、そんなファイルはありませんと言われてしまう。

この場合、Raspberry Pi側で改行コードを変換するには tr コマンドを使うのが簡単。ファイル中の文字を置換するコマンドだが、オプションを付ければ削除する事もできる。入力と出力に同じファイル名を指定すると、ゼロバイトのファイルができてしまうので注意。

pi@raspberrypi ~/PythonProjects $ tr -d ‘\r’ < helloworld.py > helloworld2.py
pi@raspberrypi ~/PythonProjects $ file helloworld2.py
helloworld2.py: Python script, ASCII text executable
pi@raspberrypi ~/PythonProjects $ chmod +x helloworld2.py
pi@raspberrypi ~/PythonProjects $ ./helloworld2.py
Hello Raspberry Pi World!

これでOK。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中