Seite 1 von 1
Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Samstag 19. November 2016, 15:39
von anonym44
Hallo,
ich versuche schon seit tagen vergeblich mein Modulordner in eine Datei umzuwandeln(Modulordner/ -> Modulordner.py oder Modulordner.so/dll).
Jetzt frage ich mich ob es vielleicht mit Cython funktioniert.
Code: Alles auswählen
...
ext_modules = [
Extension("Modulordner",["Modulordner/__init__.py"]),
Extension("db",["Modulordner/db.py"]),
...
Bis jetzt kann ich leider nur jede einzelne Datei im Modulordner umwandeln(also bin nicht viel weiter). - Ich möchte aber nur eine Ausgabedatei.
Kann mir jemand helfen?
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Samstag 19. November 2016, 16:08
von __deets__
*Warum*? Es ist nicht so ohne weiteres moeglich, weil die Paketstruktur ueber Ordner definiert wird. Wenn du also alles in eine Datei kuebelst, wird daraus auch nur ein Modul, keine Hierarchie von Modulen.
Was willst du also erreichen?
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Sonntag 20. November 2016, 00:29
von anonym44
Ich will es kompakt haben. - Und Geschwindigkeit, is ist schneller eine Datei zu laden, als 1921 Dateien einzeln.
Un die Struktur kann ich per Klassendefinition wiederherstellen.
Ich muss wohl mein eigenes Tool schreiben.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Sonntag 20. November 2016, 01:20
von BlackJack
@Amerika_befreie_uns: Die Struktur kannst Du nicht per Klassen wiederherstellen.
Du hast tatsächlich 1921 Module? Ich denke ja Du versuchst da ein Problem zu lösen was es gar nicht gibt, beziehungsweise nur in Deiner Fantasie. Oh, und zumindest als ich das letzte mal mit Codegeneratoren experimentiert hatte war der Bytecode von *einem* Modul auf 64KiB begrenzt. Keine Ahnung ob die Grenze noch existiert, aber mit handgeschriebenem Quelltext sollte die auch heute noch ”unerreichbar” sein.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Sonntag 20. November 2016, 03:20
von anonym44
Ich habe ein Modulorder mit 1921 Dateien, die ich in __init__.py einbinde.
Beim Installieren auf anderen Computern will ich das Modul als nur eine Datei haben.
Ähnlich wie in C++ habe ich gibt es Abhängigkeiten(DLLs), wenn ich das Programm an einem Freund gebe ich ihm nur eine statische Exe(alle dlls sind in die Exe fest eingebunden um Installationen von vredist.exe oder anderen Bibliotheken zu vermeiden).
Aus Benutzerfreundlichen Gründen möchte ich mein Ordnermodul als eine .so/.dll ausgeben.
Ich bin schon Dabei ein Werkzeug dafür zu schreiben.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Sonntag 20. November 2016, 11:13
von BlackJack
@Amerika_befreie_uns: Ich verstehe zwar nicht was daran benutzerunfreundlich sein soll, aber Du könntest die Dateien auch einfach in ZIP-Archiv stecken und das dann zum Modulsuchpfad hinzufügen.
Letztlich ist Benutzern aber auch egal in wie vielen Dateien ein Programm daherkommt. Damit hat man als Benutzer doch gar nichts zu tun. :K
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Sonntag 20. November 2016, 13:52
von snafu
Ich vermute mal, es geht hier um Abhängigkeiten von Fremdbibliotheken, die der Anwender nicht selber installieren soll. Für so etwas empfehlen sich fertige Tools wie py2exe oder PyInstaller. Die haben auch die Möglichkeit, dass man alles als eine einzelne EXE-Datei ausliefern kann, indem ein selbstausführendes Archiv genutzt wird.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Montag 21. November 2016, 02:09
von anonym44
snafu hat geschrieben:Ich vermute mal, es geht hier um Abhängigkeiten von Fremdbibliotheken, die der Anwender nicht selber installieren soll. Für so etwas empfehlen sich fertige Tools wie py2exe oder PyInstaller. Die haben auch die Möglichkeit, dass man alles als eine einzelne EXE-Datei ausliefern kann, indem ein selbstausführendes Archiv genutzt wird.
Mein erster Schritt ist erst einmal die Dateien in Bibliotheken umzuwandeln,
Mein Ziel ist es keine exe Datei zu erstellen, sondern eine Bibliothek, die von Python als .so/.dll aufgerufen wird.
Code: Alles auswählen
from distutils.core import *
from Cython.Build import cythonize
extensions = [
Extension("__init__", ["./src/__init__.py"]), #habe es auch schon mit cinit versucht, funktioniert aber auch nicht.
Extension("wer", ["./src/wer.py"]),
Extension("in", ["./src/in.py"]),
Extension("der", ["./src/der.py"]),
Extension("demokratie", ["./src/demokratie.py"]),
Extension("schlaeft", ["./src/schlaeft.py"]),
Extension("wacht", ["./src/c.py"]),
Extension("in", ["./src/in.py"]),
Extension("der", ["./der/net.py"]),
Extension("diktatur", ["./src/diktatur.py"]),
Extension("wieder", ["./src/wieder.py"]),
Extension("auf", ["./src/auf.py"]),
", ["./src/wsgiserver/ssl_pyopenssl.py"]),
]
setup(
name="schauspiel",
ext_modules = cythonize(extensions)
)
Es werden zwar alle py Dateien in .so Dateien umgewandelt, aber das Modul ist nicht ladbar.
- schauspiel/
schauspiel/__init__.so
schauspiel/wer.so
...
Python code:
Ergibt einen Fehler:
Code: Alles auswählen
Traceback (most recent call last):
File "load_lib.py", line 1, in <module>
import schauspiel
ImportError: No module named schauspiel
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Montag 21. November 2016, 10:07
von Sirius3
@Amerika_befreie_uns: es wird ja beim Import eines Moduls auch __init__.py gesucht und nicht __init__.so. Eine __init__-Datei als binäre Bibliothek ist sowieso komisch. Compilierte Dateien kennen nämlich keine Namespaces, die wären also immer flach. Daher kann man auch nur eine .py-Datei in eine .so-Datei verwandeln. Wenn Du also mehrere .py-Dateien in eine .so-Datei packen willst, mußt Du das händisch machen, um Namenskonflikte zu verhindern.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Montag 21. November 2016, 10:21
von __deets__
BlackJack hat es schon erwaehnt - mach einen ZIP-Import, der erfuellt deine Kriterien und zwingt dich nicht, gegen die Tools zu arbeiten.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Montag 21. November 2016, 11:36
von anonym44
Sirius3 hat geschrieben:@Amerika_befreie_uns: es wird ja beim Import eines Moduls auch __init__.py gesucht und nicht __init__.so. Eine __init__-Datei als binäre Bibliothek ist sowieso komisch. Compilierte Dateien kennen nämlich keine Namespaces, die wären also immer flach. Daher kann man auch nur eine .py-Datei in eine .so-Datei verwandeln. Wenn Du also mehrere .py-Dateien in eine .so-Datei packen willst, mußt Du das händisch machen, um Namenskonflikte zu verhindern.
Also ich kann mich mit einer zip-Datei anfreunden, danke auch an BlackJack!
Jetzt besteht nur noch das Problem dass __init__.so nicht funktioniert. Mal sehen wie ich das Problem lösen kann.
Re: Modulorder(__init__, funk.py) zu einer Datei konvertieren
Verfasst: Montag 21. November 2016, 13:49
von Sirius3
@Amerika_befreie_uns: das was in __init__.py steht wird in ein eigenes Modul verschoben und dann in __init__ wieder importiert.