2
votes

cx_Freeze: Erreur "Le système ne trouve pas le fichier spécifié" lors de la construction [win10] [PyQt4] [python2.7]

J'essaye de créer un fichier .exe à partir d'un script python (qui utilise l'interface graphique PyQt4 et matplotlib). J'utilise la version 5.1.1 de cx_Freeze pour les fenêtres 64 bits avec setup.py:

h = BeginUpdateResource(pathname, 0)
pywintypes.error: (2, 'BeginUpdateResource', 'The system cannot find the file specified.')

après l'exécution

TypeError: __init__() got an unexpected keyword argument 'targetDir'  


6 commentaires

Le script de configuration que vous avez publié ne peut pas être correct, vous avez commenté le code qui continue sur une nouvelle ligne à deux endroits. Veuillez publier le code exact que vous exécutez pour obtenir le message d'erreur que vous avez publié. Les mises en garde possibles sont les suivantes: 1. le fichier icône est introuvable ou ne peut pas être converti en fichier .ico valide, voir Comment ajouter une icône à un exécutable cx_Freeze? ; 2. un problème avec targetName ou targetDir dans l'appel Executable , voir Python cx_freeze 4.3.4: la définition de targetName provoque des erreurs


En effet, il y avait des incohérences dues au formatage et aux retours à la ligne ici, sur SO. Modifié et effacé. Je n'ai pas besoin d'icône maintenant, c'est pourquoi elle est commentée. Ensuite, je vais essayer la deuxième option.


@jpeg Il y a un problème avec le deuxième lien de votre commentaire: il apporte la même page Web que le premier lien.


Voici le lien correct: Python cx_freeze 4.3.4: La définition de targetName provoque des erreurs , désolé et merci d'avoir signalé cette erreur .


Faites également attention avec les \ dans les littéraux de chaîne, vous devrez peut-être les échapper en utilisant \\ ou ajouter un r au littéral de chaîne.


Vous pouvez également essayer d'en savoir plus sur la ressource problématique en ajoutant chemin d'accès d'impression dans votre win32verstamp.py juste avant la ligne 159 ou en exécutant votre appel de configuration en mode débogage dans un IDE et en regardant le contenu du chemin où l'erreur est levée.


4 Réponses :


1
votes

Grâce à l'aide de l'utilisateur jpeg , j'ai réussi à figer le script.
Pour éliminer le problème avec le chemin, j'ai ajouté une ligne print (chemin d'accès) dans win32verstamp.py avant la ligne 159.
L'instruction d'impression a bien fonctionné en indiquant le chemin relatif du fichier .exe nouvellement créé.
Malgré l'affichage du chemin correct, l'erreur était toujours présente. Je suis allé à la définition de stamp () dans win32verstamp.py et j'ai trouvé un essai - sauf bloc, et j'ai inséré print (chemin d'accès) là-bas .
La partie est:

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
....

Depuis que le gel était possible. (Je ne sais pas pourquoi, je serai ravi d'ajouter quelques informations si l'explication est connue)


0 commentaires

6
votes

Dans mon cas, le problème a été résolu en changeant

'build_exe': './/build_folder'

en

'build_exe': 'build_folder'

C'est parce que open (chemin d'accès) fonctionnerait sur le pathname = 'build_folder \\ executable.exe' , permettant au code d'avancer lors de la vérification au début de la méthode tampon , mais BeginUpdateResource (chemin, 0) ne fonctionnerait que sur './/build_folder\\executable.exe'


0 commentaires

0
votes

J'ai eu le même problème de geler mon application PyQt5 (en utilisant python 3.7 sous Windows 10) avec le message suivant:

executables = [cx_Freeze.Executable(os.getcwd() + r'\..\..\MyFileName.py', base=base)]
include_files = [(os.getcwd() + r'\..\..\CalibrationTool.ui', r'Inputs\GUI\CalibrationTool.ui')

J'ai donc choisi d'utiliser l'exemple cx_freeze fourni dans un premier temps . (Ces exemples sont disponibles après l'installation de cx_freeze sous MyVENVpath \ Lib \ site-packages \ cx_Freeze \ samples) L'exemple très basique de PyQt5 fonctionnait, mais mon cas était beaucoup plus complexe car j'ai utilisé plusieurs sous-classes Python que j'ai développées.

Honnêtement, je ne comprends pas vraiment pourquoi mais j'ai pu faire ça marche Voici donc toutes les modifications que j'ai effectuées:

  1. Dans setup.py, identifiez les fichiers sous python

ajouter mes packages personnels et la classe comme ceci:

include = ["PyQt5", "PySerial", "myclass1", "myclass2", "myclass3", "PandasModel"]
packages = ["PySerial", "myclass1", "myclass2", "myclass3", "PandasModel", "pandas","math"]
  1. Utilisez le chemin relatif dans setup.py

    h = BeginUpdateResource(pathname, 0)
    pywintypes.error: (2, 'BeginUpdateResource', 'Le fichier spécifié est introuvable.')
    

La raison de "...." est de sauter deux répertoires de niveau supérieur, car mon python.exe est dans les sous-dossiers VENV \ Script \

  1. Ajoutez des fichiers python contenant "Myclass1" au même niveau que setup.py.

Même si dans mon application, les fichiers de classe sont dans un sous-dossier Input \ Packages \ Myclass1File.py, j'ai dû le copier-coller au même niveau que setup.py. De cette façon, la ligne include et package de setup.py fonctionne et a pu générer l'exécutable.

  1. Dernier point mais non le moindre, la commande de terminal Je ne sais pas pourquoi mais la seule commande qui a réussi était: pour utiliser le chemin complet vers le python.exe et le chemin complet vers le setup.py avec le "build" à la fin.

    cmd:> C: \ Folder1 \ Folder2 \ MyVENV \ Scripts \ python.exe D: \ Folder1 \ Folder2 \ setup.py build

Ceci a finalement créé l'exécutable dans un dossier de construction sous C: \ Folder1 \ Folder2 \ MyVENV \ Scripts \


0 commentaires

2
votes

Solution

options = {
    'build_exe': {
        'build_exe': './/build'
    }
}

Remarque: .//build ici, build est le nom du dossier dans lequel vous souhaitez créer votre projet.


1 commentaires

Cela a été réellement utile pour le cas où d'autres options de construction sont passées. La clé imbriquée "build_exe" complique les choses, rendant les autres réponses pas si simples à utiliser.