Modulorder(__init__, funk.py) zu einer Datei konvertieren

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
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?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

*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?
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.
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.
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.
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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

Code: Alles auswählen

import schauspiel

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

BlackJack hat es schon erwaehnt - mach einen ZIP-Import, der erfuellt deine Kriterien und zwingt dich nicht, gegen die Tools zu arbeiten.
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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Amerika_befreie_uns: das was in __init__.py steht wird in ein eigenes Modul verschoben und dann in __init__ wieder importiert.
Antworten