Forum: PC-Programmierung Python, py2exe Probleme mit include files


von MArio (Gast)


Lesenswert?

Hi,

ich möchte ein Python Script in eine exe Datei umwandeln als einzelne 
exe "one file", leider möchte py2exe nicht so wie ich das möchte!

die setup.py
1
from distutils.core import setup
2
import py2exe, sys, os
3
4
5
sys.argv.append('py2exe')
6
7
setup(
8
    options = {
9
                    'py2exe': {
10
                            'bundle_files': 1,
11
                            'includes': ["tkinter", "threading", "codecs", "time", "select", "csv", "traceback", "xlsxwriter", "base64", "requests"]
12
                            
13
                    }
14
               },
15
    windows = [{'script': "mein_script.py"}],
16
    zipfile = None,
17
   
18
)

Und hier der Fehler
1
running py2exe
2
3
  26 missing Modules                 
4
  ------------------                 
5
? Cookie                              imported from requests.compat
6
? OpenSSL                             imported from requests.packages.urllib3.contrib.pyopenssl
7
? Queue                               imported from requests.packages.urllib3.connectionpool
8
? _abcoll                             imported from requests.packages.urllib3.packages.ordered_dict
9
? backports                           imported from requests.packages.urllib3.packages.ssl_match_hostname
10
? cchardet                            imported from bs4.dammit
11
? certifi                             imported from requests.certs
12
? chardet                             imported from bs4.dammit, requests.packages
13
? cookielib                           imported from requests.compat
14
? dummy_thread                        imported from requests.packages.urllib3.packages.ordered_dict
15
? html5lib                            imported from bs4.builder._html5lib
16
? iconv_codec                         imported from bs4.dammit
17
? lxml                                imported from bs4.builder._lxml
18
? ndg                                 imported from requests.packages.urllib3.contrib.pyopenssl
19
? pyasn1                              imported from requests.packages.urllib3.contrib.pyopenssl
20
? readline                            imported from cmd, code, pdb
21
? simplejson                          imported from requests.compat
22
? thread                              imported from requests.packages.urllib3.packages.ordered_dict
23
? urllib.getproxies                   imported from requests.compat
24
? urllib.proxy_bypass                 imported from requests.compat
25
? urllib.quote                        imported from requests.compat
26
? urllib.quote_plus                   imported from requests.compat
27
? urllib.unquote                      imported from requests.compat
28
? urllib.unquote_plus                 imported from requests.compat
29
? urllib.urlencode                    imported from requests.compat, requests.packages.urllib3.request
30
? urllib3                             imported from requests.packages
31
OOPS: tkinter 2


Wie bekomme ich py2exe dazu die exe als one-file zu generieren?

von Kaj (Gast)


Lesenswert?

MArio schrieb:
> Wie bekomme ich py2exe dazu die exe als one-file zu generieren?
In dem du der einfachheit halber einfach PyInstaller nimmst. Da muss du 
auch keien komische setup.py schreiben.
Einfach in der Konsole in den Projektordner wechseln und
1
pyinstaller --onefile mein_script.py
eingeben. Fertig.

Was includiert werden muss, merkt der PyInstaller von alleine,
so wie sich das gehört.
Unter Windows am einfachsten über pip zu installieren:
1
pip install pyinstaller

von MArio (Gast)


Lesenswert?

Hi,

dann komme ich mit pyinstaller zum nächsten Problem.

Ich erstelle mit tkinter eine GUI und sobald ich eine Aufforderung für 
requests habe, springt das script an das Ende und bricht ab. Als nur in 
der mein_script.exe. in der mein_script.py geht das ohne Probleme

von Kaj (Gast)


Lesenswert?

MArio schrieb:
> Als nur in
> der mein_script.exe. in der mein_script.py geht das ohne Probleme
Ohne Code wirds schwer mit helfen...
Entweder du baust Debugausgaben ein, und versuchst nachzuvollziehen, 
was schief geht, oder du müsstest mal Code posten.

Es hilft auch die exe nicht per Doppelklick zu starten, sondern aus der 
Kommandozeile zu starten, dann siehst du auch den üblichen Python 
Stacktrace wenn was schiefgeht.

Ein Python-Script ist was anderes als eine gebaute exe, bzw. läuft das 
Script in einer ganz anderen umgebung ab.


1. Anwendung aus der Kommandozeile starten damit du den Stacktrace 
siehst
2. Wenn das nicht hilft, Debugausgaben einbauen und nachvollziehen was 
schief geht
3. Wenn das nicht hilft, Code posten.

von MArio (Gast)


Lesenswert?

Hi,

also wenn ich mein_script.py in der Konsole ausführe, dann gibt es keine 
Fehlermeldungen. Wenn ich dann mein_script.exe in der Konsole ausführe, 
dann springt er mir direkt in exception die ich definiert habe

except:
   print("Fehler bei: " + file_import  + "\n")


Ich habe den Code weitgehenst gekürzt, dass es noch übersichtlich ist.

[/c]

# coding: utf-8
from tkinter import *
from tkinter import messagebox
import os
import threading
import codecs
import time
import select
import csv
import traceback
import xlsxwriter
import base64
from bs4 import BeautifulSoup
from urllib.request import urlopen
import tkinter as tk
import images_import
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import re
import requests


class MyThread5 (threading.Thread):
    def run(selfself):


        name = askopenfilename(filetypes =(("Import File", 
"*.txt"),("All Files","*.*")),
                               title = ""
                               )


        f = open(name)
        text2.insert(END, name + ' geladen.\n')
        text2.see(tk.END)


        workbook_overview = xlsxwriter.Workbook('ergebnis.xlsx')
        worksheet_overview = workbook_overview.add_worksheet("Result")

        count = 2


        for file_import in f.readlines():
            file_import = file_import.strip()

            if file_import:
                contact_person = 'NA'
            try:
                shopURL = BeautifulSoup(requests.get("meineurl=" + 
file_import).text, "html.parser")
                text2.insert(END, file_import  + "\n")
                text2.see(tk.END)

                details = shopURL.find("li", {"id": "aag_detailsAbout"})
                contact_details = str(details)


            except:
               print("Fehler bei: " + file_import  + "\n")



            worksheet_overview.write('A' + str(count), contact_person)

            count += 1

            time.sleep(1)

        workbook_overview.close()

        text2.insert(END, '\nfertig\n', 'big')
        text2.see(tk.END)




fenster = tk.Tk()


text2 = Text(fenster, height=20, width=50)
scroll = Scrollbar(fenster, command=text2.yview)
text2.configure(yscrollcommand=scroll.set)
text2.tag_configure('bold_italics', font=('Arial', 12, 'bold', 
'italic'))
text2.tag_configure('big', font=('Verdana', 10, 'bold'))
text2.tag_configure('color', foreground='#8B0000', font=('Arial', 12, 
'bold'))
text2.pack(side=LEFT)
scroll.pack(side=RIGHT, fill=Y)

m = MyThread5();
m.start()


text2.see(tk.END)
fenster.mainloop()

[/c]

von Kaj (Gast)


Lesenswert?

Wie wäre es denn, wenn du du das try-except mal so umbaust, das du auch 
siehst was nicht funktioniert hat?
Fehlermeldungen sind ja nicht zum Spaß da, die haben einen Sinn.
Ich weiß, klingt komisch, ist aber so.
1
try:
2
    # hier dein Code
3
except Exception as e:
4
    print("Fehler bei: " + file_import  + "\n")
5
    print()
6
    print("Fehlermeldung der Exception ist:")
7
    print(e)

Die Fehlermeldung sagt dir dann schon ganz genau, was nicht Funktioniert 
hat.

von MArio (Gast)


Lesenswert?

Das Problem bei mir ist, dass ich sehr viele Fehlermeldungen nicht 
verstehe.
1
Fehlermeldung der Exception ist:
2
'module' object has no attribute 'get'

Aber was ich am meisten nicht verstehe, warum geht es in der 
Entwicklungsumgebung problemlos aber als exe auf dem selben PC geht es 
nicht.

von Kaj (Gast)


Lesenswert?

MArio schrieb:
> warum geht es in der
> Entwicklungsumgebung problemlos aber als exe auf dem selben PC geht es
> nicht.
Weil die Entwicklungsumgebung (teilweise) eine andere Umgebung für das 
Programm erzeugt/bereitstellt, z.B. andere Umgebungsvariablen.
Deswegen nutze ich auch keine IDE für Python, bzw. starte das 
Python-Script immer über die Kommandozeile.
Ich hatte schon Fälle wo die Python-Anwendung super lief, wenn man sie 
aus Eclipse heraus startete, es aber ein krampf war, das Ding ohne 
Eclipse zu nutzen. Einfach, weil Eclipse eine andere Umgebung erzeugt.


MArio schrieb:
> def run(selfself):
Das soll wahrscheinlich nur
1
def run(self):
heißen.

MArio schrieb:
> Das Problem bei mir ist, dass ich sehr viele Fehlermeldungen nicht
> verstehe.
Okay, jeder fängt mal an. Python Fehlermeldungen sind aber, wie 
Fehlermeldungen des GCC, in 99% aller Fälle sehr eindeutig.

MArio schrieb:
1
Fehlermeldung der Exception ist:
2
'module' object has no attribute 'get'
Die Fehlermeldung sagt dir:
Hey, Du möchtest da was benutzen (module), aber das Ding hat kein 
Attribut (hier eine Funktion) Namens 'get', bzw. kann ich sie nicht 
finden.
Da ich in deinem Code nur ein 'get' finde heißt das konkret:
Der Pythoninterpreter in der exe-Datei ist der Meinung, dass
das Modul 'requests' keine Funktion hat die 'get' heißt.

Das kann passieren, wenn du z.B. selbst eine Pythondatei hast, die 
requests.py heißt und damit die falsche Datei eingebunden wird.
Das kann ein Fehler sein, den deine Entwicklungsumgebung schön 
kaschiert.

Hast du mal die exe-Datei in den selben Ordner kopiert, wo das 
Python-Script liegt?

Wenn du mal nach dem Fehler suchst
1
python requests: 'module' object has no attribute 'get'
dann findest du dazu schon ein paar Beiträge:
http://stackoverflow.com/questions/12258816/module-object-has-no-attribute-get-python-error-requests

von MArio (Gast)


Lesenswert?

Hi,


Kaj schrieb:
> Hast du mal die exe-Datei in den selben Ordner kopiert, wo das
> Python-Script liegt?

Ja, aber der selbe Fehler. Ich habe auch keine Datei mit den namen 
requets.py in meinem Ordner.

also, was ich jetzt so alles gemacht habe...

- requests deinstaliert
- pyinstaller deinstalliert

Und dann wieder installiert. Das ganze immer über pip.


Und jetzt geht es. Frag mich nicht wieso, aber es geht.

Danke für deine Hilfe

von Kaj (Gast)


Lesenswert?

MArio schrieb:
> Und jetzt geht es. Frag mich nicht wieso, aber es geht.
Ja, kenn ich :)

MArio schrieb:
> Danke für deine Hilfe
Gerne, auch wenn ich letzendlich ja gar nichts zur Lösung beigetragen 
habe. :)

von MArio (Gast)


Lesenswert?

Kaj schrieb:
> Gerne, auch wenn ich letzendlich ja gar nichts zur Lösung beigetragen
> habe. :)

Naja, eigentlich schon. Du hast mich Stück für Stück in die richtige 
Richtung gelenkt. Und ich habe gelernt exception besser einzusetzen.

von Eric B. (beric)


Lesenswert?

Aber funktioniert dein python script (als exe) jetzt auch auf einem 
anderen PC?

von MArio (Gast)


Lesenswert?

Ja.

Der Fehler ist entstanden beim erstellen der exe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.