Pyinstaller EXE 的 __file__ 指的是一个 .py 文件

Pyinstaller EXE's __file__ refers to a .py file

情况:我的Python脚本有一行代码将自身复制到另一个目录

shutil.copyfile(os.path.abspath(__file__), newPath)

问题:脚本随后被编译成 EXE 和 运行。报错如下:

FileNotFoundError: No such file or Directory: "C:\Path\To\EXE\script.py"

如您所见,EXE 正在寻找自身的 .py 版本(即未编译版本)

问题:是否还有另一个 Python 命令仍然可以让可执行文件找到它自己而不是它自己的 .py 版本?

附加信息:我打算尝试用 .exe 替换 .py 并查看它是否有效——如果我更改名称,程序将失败可执行文件。

C:\ > script.exe
#Works as expected

C:\ > ren script.exe program.exe
C:\ > program.exe
FileNotFoundError: No such file or directory: "C:\script.py"

尝试以下操作:

from os.path import abspath, splitext
fromfile_without_ext, ext = splitext(abspath(__file__))
shutil.copyfile(fromfile_without_ext + '.exe', newPath)

(没有测试,但应该可以...)

我也被这个问题困住了。最后我从 official document.

找到了解决方案

解决方案:

使用sys.argv[0]sys.executable访问执行文件的真实路径。


解释:

这是因为您的可执行文件是 bundle 环境。在这个环境下,所有的__file__常量都是相对于一个虚拟目录(实际上是初始入口文件所在的目录)的相对路径。

如文档所述,您可以使用 sys.argv[0]sys.executable 访问绝对值,因为它们指向实际执行的命令。所以在 bundle 环境中,你调用 script.exesys.executable 将是 script.exe。在 运行 实时环境中,您调用 python script.pathsys.executable 将是 python.exe