cx_Freeze: «Системе не удается найти указанный файл» ошибка во время сборки [win10] [PyQt4] [python2.7] - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь создать файл .exe из скрипта Python (который использует PyQt4 GUI и matplotlib). Я использую 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.')

Какое возможное решение для вышеуказанной проблемы?

EDIT
Чтобы было ясно: я не хочу добавлять какие-либо иконки на данный момент. Я доволен просто простым, работающим .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.')

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

В моем случае проблема была решена путем изменения

'build_exe': 'build_folder'

на

'build_exe': './/build_folder'

Это потому, что open(pathname) будет работать на pathname='build_folder\\executable.exe', позволяя коду перейтиво время проверки в начале метода stamp , но BeginUpdateResource(pathname, 0) будет работать только на './/build_folder\\executable.exe'

1 голос
/ 20 марта 2019

Благодаря помощи пользователя jpeg Мне удалось успешно заморозить скрипт.
Чтобы устранить проблему с путем, я добавил строку print(pathname) в win32verstamp.py перед строкой 159.
Оператор печати работал нормально, показывая относительный путь к вновь созданному файлу .exe.
Несмотря на отображение правильного пути, ошибка все еще присутствовала.Я пошел к определению stamp() в win32verstamp.py и нашел попытку - кроме блока, и вставил туда 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
....

С тех пор, как это замораживание быловозможный.(Не уверен, почему, я рад добавить некоторую информацию, если объяснение известно)

...