GUIを起動中のディレクトリの移動

GUIプログラムを実行中に、現在どこのディレクトリにいるかが重要になる場合がある。例えばGUIの中で、ファイルの入力が必要な外部プログラムを呼び出し実行するような場合を想定しているのだが。
そのとき、ファイルのパスを外部プログラムに与えなければならないとする。絶対パスでファイルパスを指定すれば大抵の場合、ちゃんと外部プログラムは動作する。しかし、稀に与えるファイルパスに文字数制限があるような外部プログラムだと困ったことが起こりうる。なので、絶対パスではなく相対パスでファイルパスを与えることで文字数を少なくして問題を回避しているのだが、GUIを実行中に、どのディレクトリから外部プログラムを実行しているかを知らないと、相対パスで外部プログラムが必要としているファイルを指定することができない。
GUIプログラムをtest.pyとする。test.pyは/home/hoge/app/test.pyにあるとする。

$ cd /home/hoge/app/
$ python test.py

で、GUIは起動できる。または、

$ cd /home/hoge
$ python app/test.py

でも同様に起動できる。
os.getcwd()をtest.pyに埋め込んで、カレントディレクトリを調べると、両者の起動方法では異なることが分かる。具体的には、pythonコマンドを実行するディレクトリがカレントディレクトリになっている。前者の場合、/home/hoge/app/がカレントディレクトリであるし、後者の場合、/home/hoge/がカレントディレクトリになる。
では、GUI実行中にカレントディレクトリを変えたときにはどうするか?意図的にカレントディレクトリを変える場合には、GUIプログラム中でos.chdir("ディレクトリ")の処理をすればよい。
または、ファイル選択ダイアログでも変えることを明示できる。

...
dlg = wx.FileDialog(self, "Choose a file",
                    defaultDir=os.getcwd(),
                    defaultFile="",
                    style=wx.OPEN|wx.CHANGE_DIR)
...

のように、wx.CHANGE_DIRスタイルを適用するとファイルを選択時にそのファイルがあるディレクトリへ移動する。このFileDialogでwx.CHANGE_DIRスタイルを使っていることを忘れると、意図せずディレクトリが変更されてたいへんなことになる(なった)。