3

私はPythonアプリを持っています。次のような処理を実行して、構成ファイル(およびその他のさまざまなファイル)をロードします。

_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CONFIG_DIR = os.path.join(_path, 'conf')

これは正常に機能します。ただし、アプリをpy2exeでパッケージ化すると、次のような問題が発生します。

  File "proj\config.pyc", line 8, in <module>
WindowsError: [Error 3] The system cannot find the path specified: 'C:\\proj\
\dist\\library.zip\\conf'

明らかに、それは無効なパスです...これを行うためのより堅牢な方法は何ですか?別のフォルダに配置される可能性があるため、プログラムで絶対パスを指定したくありません。「フォルダ名が「library.zip」であると表示されている場合は、もう1つ下の「dist」フォルダに移動します」とだけ言う必要がありますか?

かなりネストされたディレクトリ階層があることに注意してください...たとえば、「gui / utils / images.py」に保存されているモジュールgui.utils.imagesがあり、そのパスを使用して「gui / images/ok」にアクセスします。たとえば、png」。現在、py2exeバージョンは「proj / dist / library.zip / gui / images / ok.png」などにアクセスしようとしますが、これは機能しません。

4

5 に答える 5

2

py2exeアプリからos.path.dirname(os.path.abspath(sys.argv [0]))を使用すると、Pythonスクリプトからも同じように機能します(毎回exeを作成せずにテストできます)。 exeから。

これは、アプリ(.pyまたは.exe)がどこから実行されているかを心配する必要がないため、相対パスを使用するよりもはるかに優れている可能性があります。

于 2010-05-18T18:32:24.307 に答える
2

含まれているすべてのファイルに相対パスを使用することについてどう思いますか? sys.path.append(".." + os.path.sep + "images")ok.png についての例に使用できるはずだと思いますopen("ok.png", "rb")。相対パスを使用すると、py2exeによって生成されたlibrary.zipファイルの問題が修正されるはずです.少なくともそれは私にとってはそうです.

于 2009-10-02T20:08:48.967 に答える
2

これが私のソリューションです(Windows、Linux、およびMacでテスト済み)。アプリケーションまたは Python スクリプトがシンボリック リンクを介して開始された場合にも機能します。

# Get if frozen
is_frozen = bool( getattr(sys, 'frozen', None) )

# Get path variable
path = sys.path if is_frozen else sys.argv

# Get nonempty first element or raise error
if path and path[0]:
    apppath = path[0]
elif is_frozen():
    raise RuntimeError('Cannot determine app path because sys.path[0] is empty.')
else:
    raise RuntimeError('Cannot determine app path in interpreter mode.')

# Make absolute (eliminate symbolic links)
apppath = os.path.abspath( os.path.realpath(apppath) )

# Split and return
appdir, appname = os.path.split(apppath)
于 2012-04-15T13:12:55.370 に答える
0

Windowsで次のトリックを使用します。
プログラムが py2exe の「実行可能ファイル」(つまりmy_application.exe ) でフリーズdirname(__file__)すると、メインの python スクリプトが実行されているフォルダーが返されます。奇妙なことに、そのフォルダーはmy_application.exeを含むフォルダーではなく、 my_application.exe自体です。my_application.exeはバイナリ ファイルではなく、python ライブラリとコンパイル済みスクリプトを含む圧縮フォルダー (解凍できます) であることに
注意してください。 そのため、実際には my_application.exeです
os.path.dirname__file__

したがって、このコードは、構成ファイルまたはイメージのルート ディレクトリを提供します (凍結されたアプリケーションの場合は、py2exe 実行可能ファイルを含むフォルダー、それ以外の場合は、python スクリプトが実行されているフォルダー)。

dirname = os.path.dirname(__file__)
if dirname.endswith('.exe'):
    dirname = os.path.split(dirname)[0]

明らかに、方法の代わりに他の回答が示すように、より一般的で移植可能な方法を使用してファイルが凍結されているかどうかを検出できますendswith

于 2014-08-27T01:25:49.410 に答える