cx_Freeze: 'The system cannot find the file specified' during build [win10] [PyQt4] [python2.7] 错误
Posted
技术标签:
【中文标题】cx_Freeze: \'The system cannot find the file specified\' during build [win10] [PyQt4] [python2.7] 错误【英文标题】:cx_Freeze: 'The system cannot find the file specified' error during build [win10] [PyQt4] [python2.7]cx_Freeze: 'The system cannot find the file specified' during build [win10] [PyQt4] [python2.7] 错误 【发布时间】:2019-03-15 14:28:57 【问题描述】:我正在尝试从 python 脚本(使用 PyQt4 GUI 和 matplotlib)创建一个 .exe 文件。我将 cx_Freeze 版本 5.1.1 用于 64 位窗口,并带有以下 setup.py
:
import cx_Freeze
import sys
import matplotlib
base = "Win32GUI"
includes = ["atexit"]
buildOptions = dict(
#create_shared_zip=False,
#append_script_to_exe=True,
includes=includes
)
executables = [cx_Freeze.Executable(script = "main.py", base = base)] # icon = "chart32.jpg")]
cx_Freeze.setup(
name= "1ChPlotGUI",
options = dict(build_exe=buildOptions), # "build_exe": "packages": ["matplotlib"], "include_files":["chart32.jpg"],
version = "0.01",
description = "1 Channel Plotting app with GUI",
executables = executables
)
运行后
python setup.py build
在cmd中从
的位置C:\Users\Us.Er\Pyth-examples\Qt\UI-examples\ChannelplotGUI-to-exe
我有这样的事情:
running build
running build_exe
copying c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-
packages\cx_Freeze\bases\Win32GUI.exe -> build\exe.win-amd64-2.7\main.exe
copying
c:\users\Us.Er\appdata\local\enthought\canopy\user\scripts\python27.dll ->
build\exe.win-amd64-2.7\python27.dll
Traceback (most recent call last):
File "setup.py", line 23, in <module>
executables = executables
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\cx_Freeze\dist.py", line 349, in setup
distutils.core.setup(**attrs)
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\core.py", line 151, in setup
dist.run_commands()
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\dist.py", line 953, in run_commands
self.run_command(cmd)
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\command\build.py", line 127, in run
self.run_command(cmd_name)
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\cmd.py", line 326, in run_command
self.distribution.run_command(command)
File "C:\Users\Us.Er\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.7.4.3348.win-x86_64\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\cx_Freeze\dist.py", line 219, in run
freezer.Freeze()
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\cx_Freeze\freezer.py", line 626, in Freeze
self._FreezeExecutable(executable)
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\cx_Freeze\freezer.py", line 232, in _FreezeExecutable
self._AddVersionResource(exe)
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\cx_Freeze\freezer.py", line 172, in _AddVersionResource
stamp(fileName, versionInfo)
File "c:\users\Us.Er\appdata\local\enthought\canopy\user\lib\site-packages\win32\lib\win32verstamp.py", line 159, in stamp
h = BeginUpdateResource(pathname, 0)
pywintypes.error: (2, 'BeginUpdateResource', 'The system cannot find the file specified.')
上述问题的可能解决方案是什么?
编辑 需要明确的是:我现在不想添加任何图标。我对一个简单的、可工作的 .exe 感到满意 我以这种方式添加了目标:
executables = [cx_Freeze.Executable(script = "main.py", base = base, targetName="main.exe")]
我已经尝试添加
targetDir = "C:\Users\Us.Er\Pyth-examples\Qt\UI-examples\ChannelplotGUI-to-exe"
反正返回是:
TypeError: __init__() got an unexpected keyword argument 'targetDir'
主要问题和以前一样 - 最后几行的错误为:
h = BeginUpdateResource(pathname, 0)
pywintypes.error: (2, 'BeginUpdateResource', 'The system cannot find the file specified.')
【问题讨论】:
您发布的设置脚本不正确,您已在两个地方的新行上注释掉代码。请发布您正在运行的确切代码以获取您发布的错误消息。只是猜测,可能的警告是: 1. 图标文件找不到或无法转换为有效的.ico
文件,请参阅How to add an icon to a cx_Freeze executable?; 2. Executable
调用中targetName
或targetDir
的问题,见Python cx_freeze 4.3.4: Setting targetName causes errors
确实,由于格式和换行,在 SO 上存在不一致。已编辑并清除。我现在不需要图标,所以这就是它被注释掉的原因。接下来,我将尝试第二个选项。
@jpeg 您的评论中的第二个链接存在一些问题:它带来的网页与第一个链接相同。
这里是正确的链接:Python cx_freeze 4.3.4: Setting targetName causes errors,很抱歉,感谢您指出这个错误。
您还可以尝试通过在第 159 行之前的 win32verstamp.py
中添加 print pathname
或通过在 IDE 中以调试模式运行设置调用并查看引发错误的pathname
的内容。
【参考方案1】:
在我的情况下,问题是通过更改解决的
'build_exe': 'build_folder'
到
'build_exe': './/build_folder'
这是因为open(pathname)
可以在pathname='build_folder\\executable.exe'
上工作,允许代码在stamp 方法开始的检查期间前进,但BeginUpdateResource(pathname, 0)
只能在@987654326 上工作@
【讨论】:
【参考方案2】:解决方案
options =
'build_exe':
'build_exe': './/build'
注意: .//build
这里,build
是您要构建项目的文件夹名称。
【讨论】:
这对于传递其他构建选项的情况实际上很有帮助。嵌套的“build_exe”键使其他响应变得不那么简单易用。【参考方案3】:感谢用户 jpeg 的帮助,我成功地冻结了脚本。
为了消除路径问题,我在第 159 行之前的 win32verstamp.py
中添加了一行 print(pathname)
。
打印语句工作正常,显示新制作的 .exe 文件的相对路径。
尽管显示了正确的路径,但错误仍然存在。我去了win32verstamp.py
中的stamp()
定义,找到了一个try-except块,并在那里插入了print(pathname)
。
部分是:
def stamp(pathname, options):
# For some reason, the API functions report success if the file is open
# but doesnt work! Try and open the file for writing, just to see if it is
# likely the stamp will work!
#print("Current path is " + pathname)
try:
f = open(pathname, "a+b")
f.close()
print("Possible to open" + pathname) #<---line added
except IOError, why:
print "WARNING: File %s could not be opened - %s" % (pathname, why)r code here
....
因为冻结是可能的。 (不知道为什么,如果知道解释,我很乐意添加一些信息)
【讨论】:
【参考方案4】:我在冻结我的 PyQt5 应用程序(在 Windows 10 下使用 python 3.7)时遇到了同样的问题:
h = BeginUpdateResource(pathname, 0)
pywintypes.error: (2, 'BeginUpdateResource', 'Le fichier spécifié est introuvable.')
所以我选择使用作为第一步提供的 cx_freeze 示例。 (此示例在 MyVENVpath\Lib\site-packages\cx_Freeze\samples 下安装 cx_freeze 后可用) 非常基本的 PyQt5 示例正在运行,但我的案例要复杂得多,因为我使用了我开发的几个子 Python 类。
老实说,我不太明白为什么,但我能够让它工作所以这是我所做的所有修改:
-
在 setup.py 中识别子 python 文件
像这样添加我的个人包和课程:
include = ["PyQt5", "PySerial", "myclass1", "myclass2", "myclass3", "PandasModel"]
packages = ["PySerial", "myclass1", "myclass2", "myclass3", "PandasModel", "pandas","math"]
在 setup.py 中使用相对路径
executables = [cx_Freeze.Executable(os.getcwd() + r'\..\..\MyFileName.py', base=base)]
include_files = [(os.getcwd() + r'\..\..\CalibrationTool.ui', r'Inputs\GUI\CalibrationTool.ui')
“....”的原因是为了向上跳转两个目录,因为我的python.exe在子文件夹VENV\Script\
-
添加与 setup.py 处于同一级别的包含“Myclass1”的 python 文件。
即使在我的应用程序中,类文件位于子文件夹 Input\Packages\Myclass1File.py 中,我也必须将其复制粘贴到与 setup.py 相同的级别。这样 setup.py 的 include 和 package 行就可以工作并且能够生成可执行文件。
最后但并非最不重要的,终端命令 我不知道为什么,但唯一成功的命令是: 使用 python.exe 的完整路径和 setup.py 的完整路径,最后带有“build”。
cmd:>C:\Folder1\Folder2\MyVENV\Scripts\python.exe D:\Folder1\Folder2\setup.py 构建
这最终在 C:\Folder1\Folder2\MyVENV\Scripts\ 下的构建文件夹中创建了可执行文件
【讨论】:
以上是关于cx_Freeze: 'The system cannot find the file specified' during build [win10] [PyQt4] [python2.7] 错误的主要内容,如果未能解决你的问题,请参考以下文章
checkpoint 防火墙系统报错1--the internal CA certificate failed(内部CA损坏)
extract the CA cert for a particular server
PHP Problem with the SSL CA cert (path? access rights?)
git Problem with the SSL CA cert (path? access rights?)
如何解决 CA2202:避免生成 System.ObjectDisposedException 警告 [重复]
当用命令导入csv文件时提示错误[Err] 1290 - The MySQL server is running with the --secure-file-priv option so it ca