Nach Import folgt Export?

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
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

im Laufe der Modularisierung kommen hin und wieder ein paar Bibliotheken hinzu, die nicht zum Standard hinzugehören. Von der Strukturierung her habe ich ein Index-Modul, von wo aus meine Anwendung gestartet werden soll. Meine Idee ist also, dass ich bereits in meinem "index"-Modul schon mal vorab abfragen möchte, ob bestimmte Bedingungen erfüllt sind. Und da kam mir die Idee, erst einmal alles zu importieren, und am Ende wieder zu "exportieren". Ich wollte mir den Weg sparen, und in jedem Modul eine solche Abfrage zu erstellen. Ich weiß, dass man da mit einer Try-Execpt-Behandlung arbeiten kann. Damit ihr versteht was ich meine, hier der Quelltext meines Index-Modules:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
failed = 0

if sys.version_info < (2,7):
    failed = 1
    sys.stderr.write("""
###########################################################
## Xarphus needs Python version 2.7 or higher.           ##
##                                                       ##
## Please consider an upgrade.                           ##
###########################################################
""")

if sys.version_info >= (3,):
    failed = 1
    sys.stderr.write("""
###########################################################
## Xarphus does not yet run on Python 3.                 ##
##                                                       ##
## Please consider a downgrade.                          ##
###########################################################
""")
    
FILE_NAME = "xarphus.py"


def main():
    try:
        from PyQt4 import *
        print FILE_NAME + ": all modules are imported"
        start_main()
    except ImportError, e:
        print e
        failed = 1
        sys.stderr.write("""
###########################################################
## ImportError: Unable to import module: PyQt4           ##
##                                                       ##
## PyQt4 is needed for the Graphical User Interface, and ##
## must be installed in order to successfully run        ##
## Xarphus                                               ##
## PyQt4 can be obtained from:                           ##
##                                                       ##
## http://www.riverbankcomputing.com/software/pyqt/intro ##
###########################################################
""")
    except IOError as (errno, strerror):
        print FILE_NAME + ": I/O error({0}): {1}".format(errno, strerror)
    except:
        print FILE_NAME + ": Unexpected error:", sys.exc_info()[0]
        raise

if failed:
    print "Exiting ..."
    sys.exit(1)

del failed


if __name__ == "__main__":
    main()
Wir sehen also, dass ich zu allererst die Versionen abfrage, und im Anschluss in Zeile 31 alle PyQt4 Klassen lade. Natürlich wollte ich weiter gehen, und all die Bibliotheken importieren, die meine Anwendung im Laufe der Zeit braucht, zum Beispiel MysSQLlib oder SQLAlchemy etc. Jedoch brauche ich die Klassen im Index-Modul nicht, ich wollte nur testen, ob die Klassen importiert werden kann. Wenn nicht, soll eine Meldung ausgeworfen werden. Und da kam mir die Frage auf, ob ich all das, was ich zuvor importiert habe, auch wieder "los werden" kann?
BlackJack

@Sophus: Normalerweise stehen die Importe am Anfang des Moduls, das heisst wenn das Hauptmodul geladen wird, dann werden rekursiv auch alle Module importiert die das Programm braucht. Und wenn dabei etwas nicht importiert werden kann gibt es eine Ausnahme. Um Abhängigkeiten und Versionen kümmert man sich beim installieren und nicht jedes mal wenn man das Programm startet. Du versuchst da ein Mikromanaging von Modulen zu betreiben das nicht normal ist.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Also gibt es keine Möglichkeit, so wie ich es mir vorstelle? Dann müsste ich mich damit auseinandersetzen, wie man eine Install-Routine schreibt, der dann schaut, ob die Python-Version drauf ist und ob auch PyQt4 vorhanden ist. Aber meine Idee war eher darauf angelegt, wenn jemand sich meinen Code schnappt, und es bei sich ausführen will. Dann braucht man keinen Installer per se? Oder aber ich verstehe unter Installieren sowas wie unter Windows.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: Der einfachste Weg ist der, dass Du eine README-Datei hast, in der alle Abhängigkeiten aufgelistet sind. Wer eine andere Konfiguration hat, weiß entweder, was er tut und kann Glück haben, oder eben nicht. Pip hat dafür einen Mechanismus, der nennt sich requirements.txt. Damit spart man sich das mühsame Zusammensuchen der richtige Paketversionen.
Bevormundungen, wie die Version ist aber in der letzten Stelle eins zu klein, und deswegen starte ich nicht, nerven mich schon bei C und ich bin froh, dass es sowas in der Pythonwelt so gut wie nicht gibt.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Ich habe noch nicht die große Erfahrung gesammelt, und fremde Quelltexte auf meinem Rechner eingelesen. Einige waren dabei, die gefühlte Tausende Fehlermeldungen warfen. Das hat mich eher zurückgeschreckt. Und da bin ich auf die Idee gekommen, es in meinem Quelltext "besser" zu machen, indem ich die Versionen abfrage, und dann wollte ich weiter, und nach den Bibliotheken schauen, die meine Anwendung braucht. Wenn etwas fehlt, soll die Person "freundlicher" darauf hingewiesen werden. Und dies wollte ich eben alles in mein Index-Modul auslagern. Und was hat es mit der requirements.txt. auf sich? Muss ich sie schreiben, damit Pip die richtigen Bibliotheken zusammensucht?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, ein Python Programm für normal sterbliche anzubieten, ist leider nicht so einfach... Sie dazu: http://www.python-forum.de/viewtopic.php?f=1&t=35061


Bzw Sternchen import immer vermeiden, auch wenn man gerade bei GUI Beispiel code oft welchen findet...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten