os.chdirで作業ディレクトリを変更する

先日cron経由でpythonスクリプトを定期実行しようとしたのだが、スクリプトが実行されている様子がない。
しかし手動で % python hogehoge.py のように動かすと問題なく動く。なんだこれ。


調べた結果、cronで動かしたスクリプトは作業ディレクトリを/home/(ユーザ名)として走るようだ。
スクリプト内部で、動作に必要なファイル名を相対パス指定してたものだから、そりゃ動かないはずである。
python hogehoge.py 2>&1 >/dev/null python hogehoge.py >/dev/null 2>&1 として標準エラー出力を握りつぶしていたものだから余計分かりにくい。


となれば作業ディレクトリをスクリプト本体のある場所と同じにする一手間が必要となる。

os.chdir(os.path.dirname(sys.argv[0]))

……これだと手動で % python hogehoge.py と呼び出した時にos.chdir('')が実行されることになり、例外が飛んでくる。
% python ./hogehoge.py と呼び出すと回避できるが、毎回入力するのも面倒だ。


その2。

if os.path.dirname(sys.argv[0]):
    os.chdir(os.path.dirname(sys.argv[0]))

悪くはないが、os.path.dirname(sys.argv[0])が重複しているのが何やら不恰好である。


しばらく考えたら↓のようになった。

os.chdir(os.path.dirname(sys.argv[0]) or '.')

これならpythonのor演算子の仕様に従って適切にos.chdir()が実行されるので万事OK。


まあpython使いの間では常識クラスなのか、あるいは下策なのかもしれないけれど、とりあえずメモ。


あと、例外はちゃんとtry〜exceptで捕捉してエラーログにでも書き出すべきだったかな。


[追記]
リダイレクトの仕方が間違っていたので修正。

[追記・2]
コメント欄で指摘をいただいた。

os.chdir(sys.path[0])

↑の方がすっきり簡潔。ありがとうございました。