1
votes

cx_Freeze TypeError dist doit être une instance de distribution

Je ne trouve pas de sujet spécifique sur ce problème avec le fichier d'installation de cx_Freeze. J'essaye de créer un exe pour mon programme mais quelque chose ne va pas avec les distutils . Je ne suis pas en mesure de localiser une mise à jour whl pour cette bibliothèque, donc je ne suis pas sûr qu'il existe un correctif connu pour cela.

Le programme fonctionne correctement sans erreur.

Quelqu'un sait-il pourquoi ce problème existe. Veuillez noter que je ne peux pas utiliser pip depuis mon réseau de travail, je dois donc tout faire avec whl , tar.gz 'et egg fichiers pour installer des bibliothèques. C'est pourquoi j'essaie de trouver un fichier whl mis à jour pour distutils.

Mon fichier setup.py.

"C:\Users\user_name\Desktop\Python 3.6.2\python.exe" "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.2.3\helpers\pycharm\pycharm_setup_runner.py" "C:\Users\user_name\Desktop\Python Work Projects\GATE\setup.py"
Testing started at 2:55 PM ...
Traceback (most recent call last):
running pycharm_test
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.2.3\helpers\pycharm\pycharm_setup_runner.py", line 26, in <module>
    exec (fh.read(), globals(), locals())
  File "<string>", line 21, in <module>
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\site-packages\cx_Freeze\dist.py", line 349, in setup
    distutils.core.setup(**attrs)
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\distutils\dist.py", line 972, in run_command
    cmd_obj = self.get_command_obj(command)
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\distutils\dist.py", line 847, in get_command_obj
    cmd_obj = self.command_obj[command] = klass(self)
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\site-packages\setuptools\__init__.py", line 147, in __init__
    _Command.__init__(self, dist)
  File "C:\Users\user_name\Desktop\Python 3.6.2\lib\distutils\cmd.py", line 57, in __init__
    raise TypeError("dist must be a Distribution instance")
TypeError: dist must be a Distribution instance

L'erreur:

from cx_Freeze import setup, Executable

base = None    

build_exe_options = {'packages': ['idna',
                                  'json',
                                  'tkinter',
                                  'operator',
                                  'clipboard',
                                  'matplotlib',
                                  'tkinter.ttk ',
                                  'matplotlib.pyplot',
                                  'matplotlib.backends.backend_tkagg'],
                     'include_files': ['tracker1.json', 'tracker2.json']}

setup(
    name='<NAME>',
    options={'build.exe': build_exe_options},
    version='<0.2>',
    description='<some random desc>',
    executables=[Executable('MAIN.py', base=base)]
)


8 commentaires

Quelle version de cx_Freeze utilisez-vous?


Et quelle commande exécutez-vous réellement pour appeler le script d'installation? Encore une chose: la clé de dictionnaire options doit lire 'build_exe' , pas 'build.exe' .


@jpeg hé merci pour les commentaires. J'ai utilisé build.exe avant et cela a bien fonctionné. J'utilise également la dernière version publiée cx_Freeze 5.1.1 du site PyPi. Il existe une version préliminaire, mais j'ai tendance à n'utiliser que des versions complètes pour éviter les problèmes.


En ce qui concerne l'utilisation de build.exe : d'après ce que j'ai essayé, on peut invoquer le script de configuration sans erreur, mais cela ne fonctionne pas dans le sens où aucune option n'est passée au build alors. En ce qui concerne l'utilisation de cx_Freeze 5.1.1, c'est très bien. Je demandais parce que le support de Python 3.6 a été introduit avec cx_Freeze 5.0.1, si vous auriez utilisé une version antérieure, cela aurait pu être un problème de compatibilité avec cx_Freeze .


Pourquoi insistez-vous pour avoir la balise matplotlib ? Je ne vois vraiment pas la pertinence de votre question.


@jpeg 'matplotlib' a causé d'autres problèmes avec la construction d'un fichier exe pour moi et pourrait être lié à ce problème. Il est possible que les dépendances fassent partie du problème.


Je suis d'accord avec la première moitié de votre première phrase, mais en désaccord avec le reste ... de toute façon, nous pouvons laisser cela ouvert au moins jusqu'à ce que la solution à votre problème devienne claire :-)


Quoi qu'il en soit, je crois à peine que le script de configuration que vous avez posté fonctionne correctement avec cx_Freeze 5.1.1 si votre MAIN.py utilise réellement tkinter et < code> matplotlib et que l'exécutable produit s'exécute sans erreur sur une autre machine. 1) corriger build_exe comme mentionné ci-dessus; 2) ajoutez 'numpy' à la liste des packages, voir cette question ; 3) changez base pour Windows et indiquez à cx_Freeze comment inclure les DLL TK / TCL, voir cette réponse pour un exemple de travail utilisant tkinter


3 Réponses :


0
votes

Essayez de mettre à jour setuptools en utilisant par exemple setuptools-40.8.0-py2.py3-none-any.whl de Fichiers binaires Windows de Gohlke Voir aussi TypeError: dist doit être une instance de distribution .


7 commentaires

Malheureusement, je ne peux pas télécharger le whl dans le lien. Mon pare-feu professionnel ne me laisse pas.


Eh bien ... est-il possible de le télécharger avec une autre machine sur un autre réseau et de l'envoyer par courrier électronique à votre compte professionnel (si le pare-feu vous le permet) ou de le prendre sur une clé USB (si la politique de l'entreprise vous le permet)?


Nan. Le pare-feu supprime tous les fichiers zip et tout ce qui peut être considéré comme du code et les ports USB sont tous désactivés. C'est frustrant. Je construis cette application pour le travail, mais le travail ne me permettra pas de télécharger les fichiers dont j'ai besoin lol.


Cela semble vraiment frustrant, je ne sais pas comment aider davantage. Au fait, la ressource que j'ai liée se définit elle-même comme non officielle mais est largement utilisée, on rencontre très souvent des liens avec elle; nous utilisons également ces roues dans l'entreprise pour laquelle je travaille, par exemple.


Depuis le lien binaire Windows?


Oui, à partir des binaires Windows de Gohlke.


J'ai réussi à résoudre le problème et à faire fonctionner mon intrigue dans l'application. Le problème principal était donc de savoir comment j'essayais d'exécuter la construction. Les problèmes secondaires étaient dus à des importations manquantes. Je suppose que 'numpy.core._methods' et `` 'numpy.lib.format' 'doivent être explicitement importés sous forme même si je n'utilise pas numpy directement dans mon py fichier. Après avoir ajouté quelques os.environ [] pour les bibliothèques tcl et tk et les autres importations pour la construction, il est compilé et exécuté sans problème.



0
votes

Après avoir beaucoup creusé et traité plusieurs erreurs après avoir obtenu le fichier à compiler dans un exe, j'ai résolu mon problème.

La plus grande partie du problème était liée au code setup.py >. J'ai dû ajouter quelques éléments pour que tout se compile correctement.

nouveau fichier setup.py :

python "C:\Users\user_name\Desktop\Python Work Projects\PROJECT\setup.py" build

Après que je devais exécuter la commande build dans le CMD ou je finirais par avoir des erreurs dans ma console IDE.

Je ne sais pas pourquoi mais il semble qu'il est nécessaire d'utiliser l'invite de commande pour exécuter la configuration .py ou bien cela ne fonctionnera pas.

Voici la commande si quelqu'un d'autre en a besoin:

python setup.py build

Gardez à l'esprit que vous devrez peut-être utiliser un chemin d'accès complet pour travailler avec le fichier d'installation. J'ai dû configurer mon répertoire de travail en utilisant la commande ci-dessous:

from cx_Freeze import setup, Executable
import os
base = "Win32GUI" # this lets the exe run without the console popping up.

# I had to add these 2 in order for tkinter to compile properly
os.environ['TCL_LIBRARY'] = r'C:\Users\user_name\Desktop\Python3.6.2\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\user_name\Desktop\Python3.6.2\tcl\tk8.6'

# eventhough numpy is not part of my main imports in my MAIN file I still needed to 
# provide 'numpy.core._methods' and 'numpy.lib.format' in the packages list for 
# my plot to work. I am assuming it is because `matplotlib` is using `numpy` somewhere.
build_exe_options = {'packages': ['numpy.core._methods',
                                  'numpy.lib.format',
                                  'idna',
                                  'json',
                                  'tkinter',
                                  'operator',
                                  'clipboard',
                                  'matplotlib',
                                  'tkinter.ttk',
                                  'matplotlib.pyplot',
                                  'matplotlib.backends.backend_tkagg'],
                     'include_files': [r'tracker1.json',
                                       r'tracker2.json',
                                       "tcl86t.dll",
                                       "tk86t.dll"]}
# On jpeg's advice I changed build.exe to build_exe though I am not sure what the change was for.
setup(
    name='<CCC>',
    options={'build_exe': build_exe_options},
    version='<0.2>',
    description='<CCC - Copy Count Chart!.>',
    executables=[Executable(r'C:\path\MAIN.py', base=base)]
)


0 commentaires

0
votes

J'ai eu un problème similaire qui a été résolu en ajoutant import setuptools en haut. Je pense que cela corrige certaines des importations dans cx_Freeze , mais je ne suis pas sûr si c'est lié.

import setuptools
from cx_Freeze import setup, Executable

...

Cela a également fonctionné sans ajouter 'numpy. core._methods ',' numpy.lib.format '.


0 commentaires