py2exe: SyntaxError: asyncsupport.py, line 22

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Hallo zusammen,

ich benötige bei meinem Vorhaben etwas Hilfe. Kennt sich jemand mit py2exe gut aus und kann mir helfen?

Mein Vorhaben:
Ich habe ein Skript in Python geschrieben. Dieses möchte ich nun in eine exe-Datei konvertieren.

Meine Umgebung:
Anaconda 5.3.0
Python 2.7.15
py2exe 0.6.9
asammdf 4.1.5

Fehlermeldung beim Erstellen der exe-Datei:
>python Setup.py py2exe
error: compiling .... SyntaxError: invalid syntax (asyncsupport.py, line 22)


Mein Setup-Skript:

from distutils.core import setup
import py2exe
setup(console=['meinSkript.py'])


Zwar findet man im Internet ein paar Sachen hierzu, diese verweisen aber auf eine Neuinstallation.
Weiß jemand wie ich das Problem beheben kann ohne jetzt alles neu installieren zu müssen?

Vielen Dank und schöne Grüße
Armend
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Problem ist das jinja async für Python 3 unterstüzt, py2exe aber nicht erkennen kann, dass das Modul für den normalen Betrieb gar nicht gebraucht wird. Du kannst entweder versuchen jinja ganz zu entfernen, falls Du es nicht brauchst, eine ältere Version installieren, die noch nicht async benutzt, oder Deine jetzige Jinja-Installation zu patchen.
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Danke für deine Unterstützung.

Kann ich auch die jinja einfach nur exkludieren?

Also:

setup(console=['meinSkript.py'], options = { 'py2exe' : { 'excludes' : [ 'jinja' ] } } ).

Habe ich das richtig geschrieben? Einfach jinja reinschreiben oder?

Viele Grüße
Armend
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

ok das exkludieren hat geklappt.
Fehlermeldung kommt nicht mehr.

Nun habe ich aber eine andere Fehlermeldung bekommen:

RunTimeError: Maximum recursion depth exceeded in cmp

Könnte das mit der Anzahl der Packages, die ich in meinem Skript importiere, zu tun haben?
Ich habe py2exe bereits erfolgreich an einem Test-Skript, bei dem ich nur ein String ausgebe (print ), getestet. Da hat es super funktioniert.

Die Packages, die ich nun importiere sind folgende:
import asammdf
import matplotlib.pyplot as plt
from copy import deepcopy
import time
import datetime
import numpy as np
import os
import shutil
import Tkinter as tk
import warnings
import thread
from tkFileDialog import askopenfile, askdirectory
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Kommt der Fehler bei py2exe oder beim Ausführen der exe? Funktioniert Dein Skript denn direkt?
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

sevus,

zu deinen Fragen: Der Fehler kommt beim Erstellen der exe-Datei. Mein Skript funktioniert an sich. Darin ist kein Problem.

Ich konnte herausfinden, dass es tatsächlich etwas mit dem Importieren der Packages zu tun hat. Um genau zu sein mit dem asammdf.

Sobald ich das Package asammdf in meinem Skript importiere bekomme ich die erwähnte Fehlermeldung beim Erstellen der exe-Datei.
Ich habe noch folgendes versucht:

sys.setrecursionlimit(5000) -> und mehr.

Hilft aber nicht.

Es hat etwas mit dem asammdf zu tun. Dieses brauche ich aber und kann es deswegen nicht einfach rausnehmen.
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Update!!!

Das Problem mit dem RunTimeError habe ich gelöst. Anscheinend hängt es von der Reihenfolge der importierten Packages ab. Wenn ich das Package asammdf als erstes importiere laufe ich in diesen RunTimeError rein. Wenn ich es aber als letztes importiere bekomme ich den Fehler nicht mehr. Ich weiß aber noch nicht warum das so ist.

Nun habe ich die exe-Datei :)

Aber leider bekomme ich beim Abspielen der exe-Datei eine andere Fehlermeldung :(

(base) C:\User\Test > meinSkript.exe
Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll

das mkl_intel_thread.dll existiert nicht in dem vom py2exe erzeugten dist-Ordner.

Kennst das Problem jemand?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Externe DLLs muß man noch extra bei py2exe angeben. Die Lösungen die ich auf die schnelle gefunden haben, sagen, dass man data_files=[('.', 'foo.dll'), ('.', 'bar.dll')] angeben soll, ob das funktioniert?
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Ja also ich habe die DLL nun kopiert. Auch diese Fehlermeldung ist nun behoben.

Aber es kommen immer wieder welche. Das ist ja "grausam".

Danach kam ein Fehler bzgl. Data_Files. Auch das habe ich behoben.

Jetzt bin ich bei folgender Fehlermeldung hängen geblieben:
ImportError: C extension: No module named np_datetime not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext - -inplace - -force' to build the C extensions first.

Ich verstehe aber noch nicht, was das denn heißen soll. np_datetime.pyd ist installiert. Wieso benutzt py2exe diese denn nicht.

hast du eine Idee was man nun machen kann?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal was anderes: ``import thread`` ist falsch. Das Modul sollte man seit Ewigkeiten schon nicht mehr verwenden. Dafür gibt es das `threading`-Modul.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Naja gut ich weiß nicht wieso du sagst, dass thread falsch wäre, wennn es doch funktioniert.
Ich weiß, dass es auch das Package threading gibt. Aber ich habe jetzt halt ohne irgendwelche Hintergedanken das thread-Modul verwendet. Funtkioniert ja trotzdem.
Aber danke für dein Feedback :)

Nun zur Fehlermeldung "ImportError: C extension: No module named np_datetime not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext - -inplace - -force' to build the C extensions first"
Hatte jemand vielleicht schon mal so ein Problem und weiß wie man das schnell und sauber lösen kann?

Wenn ich jetzt widerwillen doch auf Python 3.4 und py2exe 0.9.2.2 umsteige - was ich vermeiden wollte - muss ich dann immer noch mit den ImportErrors rechnen oder wurde das in der neueren Version schon gelöst? Zumindest klang die Beschreibung sehr viel versprechend.
Für jede Hilfe bin ich dankbar.

Viele Grüße
Armend
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Armend: Das etwas funktioniert macht es nicht automatisch richtig. Das `thread`-Modul soll nicht mehr verwendet werden. Dafür wurde das `threading`-Modul eingeführt. Schon vor sehr langer Zeit. Das `thread`-Modul gibt es halt noch aus Gründen der Rückwärtskompatibilität. In Python 2. In Python 3 gibt es das nicht mehr. Also wenn Du auf Python 3 umsteigst wirst Du das spätestens dann ändern müssen.

Warum Python 3.4? Das ist ja nun auch schon etwas älter. Ich würde auch da mit den gleichen Herausforderungen rechnen. Python ist eine dynamische Programmiersprache bei der es nicht einfach und in einigen Fällen auch unmöglich ist ”statische” Eigenschaften wie „was wird alles importiert und was wird nicht gebraucht“ herauszufinden ohne das Programm tatsächlich auszuführen. Wenn man da nur das Minimum in eine Archiv verpacken will, dann muss man schon ein bisschen wissen was man tut. Und bei Packages die Import-Magie betreiben und/oder C-Erweiterungen und/oder zusätzliche DLLs benötigen kann es noch mal zusätzliche Herausforderungen geben. Das liegt in der Natur der Sache.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Hi __blackjack__,

ja, da magst du recht haben.

"Warum Python 3.4?"
Die letzte Version von py2exe ist die 0.9.2.2. Diese soll mit maximal python 3.4 kompatibel sein. Zumindest habe ich gelesen (-> ich habe das aber noch nicht überprüft, weil ich auch gar nicht etwas neueres installieren wollte).

Naja, ich versuche es weiter. Danke für dein Feedback.

Viele Grüße
Armend
danielhrisca
User
Beiträge: 4
Registriert: Mittwoch 7. November 2018, 20:37

Ich hatte mit pyinstaller oder cx_freeze ein besseres Glück (ihre neuesten development branch haben viele Fehler behoben, daher installiere ich sie anstelle der neuesten Version von PYPI). Für meine Projekte habe ich in letzter Zeit cx_freeze mit sehr guten Ergebnissen verwendet
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Ok, danke vielmals.
Antworten