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

Tim*_*ong 4 python executable pyinstaller python-3.x

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

shutil.copyfile(os.path.abspath(__file__), newPath)
Run Code Online (Sandbox Code Playgroud)

问题:脚本然后被编译成一个 EXE 并运行。给出的错误如下:

FileNotFoundError: No such file or Directory: "C:\Path\To\EXE\script.py"
Run Code Online (Sandbox Code Playgroud)

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

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

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

C:\ > script.exe
#Works as expected

C:\ > ren script.exe program.exe
C:\ > program.exe
FileNotFoundError: No such file or directory: "C:\script.py"
Run Code Online (Sandbox Code Playgroud)

cos*_*ang 7

我也被这个问题困住了。最后我从官方文档中找到了解决方案。


解决方案

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


说明

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

按照文档的指示,您可以使用sys.argv[0]或访问绝对值sys.executable,因为它们指向实际执行的命令。因此,在bundle环境中,您调用script.exe,并且sys.executable将是script.exe。在正在运行的实时环境中,您调用python script.path,并且sys.executable将是python.exe