Mac 上の .app には、起動時に適切な現在の作業ディレクトリがありません。
もちろん、いくつかの作業ディレクトリがあり、実行時にそれが何であるかを簡単に見つけることができますos.getcwd()
.OS Xのさまざまなバージョンで起動するさまざまな方法をテストして、すべてのパターンを把握できます.それはあなたですか?
良いニュースは、実際には現在の作業ディレクトリが必要ないようです。.app バンドルまたは .exe のディレクトリが必要です。
つまり、誰かがこれを行う場合:
C:\Users\foo> C:\Stuff\MyProgram.exe
(作業ディレクトリC:\Stuff
)ではなく(実行可能ファイルのディレクトリ)が必要です。C:\Users\foo
Windows では、これは簡単です。.exe は単なるファイルであり、そのパスは__path__
Python で取得したものになるため、次のようになります。
import os
pathToApp = os.path.dirname(__path__)
Macでは、それはより困難です。.app はバンドル (他のファイルとディレクトリを含むディレクトリ) です。どこかに実行可能なインタープリターとスクリプトのコピーがあり__path__
、.app へのパスではなく後者を提供します。
これを取得する正しい方法は、Cocoa (または CoreFoundation) を使用することです。
import Cocoa
pathToApp = Cocoa.NSBundle.mainBundle().bundlePath()
それをしたくない場合は、ドキュメンテーションで信頼できず、いつか変更される可能性があると書かれているいくつかの情報にほとんど依存する必要があります。ただし、次のコードは安全なはずです。
import os
pathToApp = __file__
while not pathToApp.endswith('.app'):
path = os.path.dirname(path)
これが機能しないようにするには、スクリプトが .app バンドルの外にあるか、探しているバンドル内の別の .app 内にあるか、またはバンドルの名前が .app になるのをやめる必要があります。通常のディレクトリとして構造化するのをやめる必要があります。これは、OS X 10.* や OS Y 11 でも変わらないようです。
副次的な問題として、あなたがやろうとしていることは、そもそも悪い考えである可能性が最も高いです。Mac アプリケーションは、それと一緒にファイルを操作するべきではありません。逆に、ユーザーがそれと並行してファイルで作業することを期待している場合は、アプリケーションではなく、単純な Unix 実行可能ファイル (または chmod +x を使用した単純な Python スクリプト) が必要になるでしょう。