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.exe
,sys.executable
将是 script.exe
。在 运行 实时环境中,您调用 python script.path
,sys.executable
将是 python.exe
。
情况:我的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.exe
,sys.executable
将是 script.exe
。在 运行 实时环境中,您调用 python script.path
,sys.executable
将是 python.exe
。