2

「data.txt」という現在の作業ディレクトリにあるテキストファイルを読み取り、その中のデータを別の別のプログラムが処理できるようにjson形式に変換するpythonスクリプトがあります。

私が抱えている問題は、pythonスクリプトがすべてバンドルされているときに.appと同じディレクトリにある.txtファイルを読み取る(そして新しいファイルを書き込む)方法がわからないことです。私が使用している現在の方法は、.app として実行されるのではなく、端末から実行されたという事実を使用して何かを行うために機能しませんか?

どんな助けでも大歓迎です!

4

2 に答える 2

2

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 スクリプト) が必要になるでしょう。

于 2012-09-20T21:40:44.110 に答える
0

変数を使用し__file__ます。これにより、モジュールのファイル名がわかります。の関数を使用してos.path、モジュールの親ディレクトリのフルパスを決定できます。モジュールは標準のos.pathPythonドキュメントにあり、それを見つけることができるはずです。

次に、を使用して、モジュールパスとファイル名を組み合わせて開くことができますos.path.join

于 2012-09-20T20:28:39.353 に答える