py2exe ドキュメント リファレンスは次のとおりです。関連項目は次のとおりです。
sys.executableexeファイルのフルパス名に設定されます。
- の最初の項目
sys.argvは実行可能ファイルのフル パス名で、残りはコマンド ライン引数です。
sys.frozen実行可能ファイルにのみ存在します。コンソール実行可能ファイルの場合は「console_exe」、コンソールなしの GUI 実行可能ファイルの場合は「windows_exe」、インプロセス dll サーバーの場合は「dll」に設定されます。
__file__は定義されていません (代わりに sys.argv[0] を使用することをお勧めします)
これらのドキュメントからは、「exe ファイル」と「実行可能ファイル」が同じものであるかどうか、したがってsys.executableとsys.argv[0]が同じものであるかどうかは明らかではありません。前回、script.py と py2exe_executable.exe の両方で機能したコードを見ると、次のようなことがわかります。
if hasattr(sys, 'frozen'):
basis = sys.executable
else:
basis = sys.argv[0]
required_folder = os.path.split(basis)[0]
私が言うように、それはうまくいきましたが、なぜそれが必要だと思ったのか思い出せませんsys.argv[0]。
basis手元のジョブ (そのディレクトリ内のファイルを読み取る) には、使用するだけで十分でした。より永続的な記録については、 のように分割しますos.path.realpath(basis)。
更新実際にテストを行いました。当て推量と肘掛け椅子のポンティフィケーションを打ち負かします:-)
概要: sys.frozen を無視し、sys.executable を無視し、無条件に sys.argv[0] を使用します。
証拠:
=== foo.py ===
# coding: ascii
import sys, os.path
print 'sys has frozen:', hasattr(sys, 'frozen')
print 'using sys.executable:', repr(os.path.dirname(os.path.realpath(sys.executable)))
print 'using sys.argv[0]:', repr(os.path.dirname(os.path.realpath(sys.argv[0] )))
=== setup.py ===
from distutils.core import setup
import py2exe
setup(console=['foo.py'])
=== 結果 ===
C:\junk\so\py2exe>\python26\python foo.py
sys has frozen: False
using sys.executable: 'C:\\python26'
using sys.argv[0]: 'C:\\junk\\so\\py2exe' # where foo.py lives
C:\junk\so\py2exe>dist\foo
sys has frozen: True
using sys.executable: 'C:\\junk\\so\\py2exe\\dist'
using sys.argv[0]: 'C:\\junk\\so\\py2exe\\dist' # where foo.exe lives