这里是py2exe documentation reference,这里是相关项目:
-
sys.executable 设置为 exe 文件的完整路径名。
-
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