gpt4 book ai didi

python - 如何在 py2exe 中获取可执行文件的当前目录?

转载 作者:IT老高 更新时间:2023-10-28 21:09:14 25 4
gpt4 key购买 nike

我在我的脚本中使用这段代码以跨平台的方式精确定位它的运行位置:

SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))

很简单。然后,我继续在脚本的其他区域使用 SCRIPT_ROOT 以确保一切都正确相关。当我通过 py2exe 运行它时会出现我的问题,因为生成的可执行文件没有设置 __file__,因此我的脚本会中断。有谁知道如何解决或解决这个问题?

最佳答案

这里是 py2exe documentation reference以下是相关项目:

  • sys.executable 设置为 exe 文件的完整路径名。
  • sys.argv 中的第一项是可执行文件的完整路径名,其余是命令行参数。
  • sys.frozen 只存在于可执行文件中。对于控制台可执行文件,它设置为“console_exe”,对于无控制台的 gui 可执行文件,设置为“windows_exe”,对于进程内 dll 服务器,设置为“dll”。
  • __file__ 未定义(您可能想改用 sys.argv[0])

从这些文档中看不出“exe 文件”和“可执行文件”是否相同,因此 sys.executablesys.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

关于python - 如何在 py2exe 中获取可执行文件的当前目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com