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

时间:2018-06-21 02:03:10

标签: python python-3.x executable pyinstaller

情况:我的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版本?

其他信息:我打算尝试将.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"

2 个答案:

答案 0 :(得分:1)

尝试以下操作:

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

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

答案 1 :(得分:1)

我也陷入了这个问题。最后,我从official document找到了解决方案。


解决方案

使用backgroundColor: 'rgb(54, 162, 235)', pointBackgroundColor: 'rgb(54, 162, 235)' sys.argv[0]访问已执行文件的真实路径。


说明

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

根据文档的说明,您可以使用__file__sys.argv[0]来访问绝对值,因为它们指向实际执行的命令。因此,在sys.executable环境中,您调用bundle,而script.exe将是sys.executable。在运行中的实时环境中,您呼叫script.exe,而python script.path将是sys.executable