Datei Öffen und den Inhalt ausführen???

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 26. Januar 2008, 19:24

Hallo

Ich möchte in einer Datei gespeicherte "def" aufrufe ausführen.

Die Datei die geöffnet wird sieht so aus:

test1()
test2()
test3()

Im Programm gibt es dann die drei def´s dazu.

Die Datei öffen ich so:

Code: Alles auswählen

def oeffnen():
    name = raw_input("geben sie den Namen der Datei ein: ")
    datei = file(name, "r")
    global line
    for line in datei.readlines():
        print line
        datei.close
Wenn ich "print line" schreibe kommt der Inhalt also wird die Datei schonmal gelesen, nur wie bekomme ich es hin das erst test1() und dann test2() und dann test3() ausgeführt wird.

Gruß
Andyh
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Samstag 26. Januar 2008, 19:39

Ich würde mal sagen, dass du die Datei nicht lesend öffnest, sondern ein ganz normales import oder reimport (?) machst, also so wie immer, wenn du Definitionen aus einer anderen Datei holst.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Samstag 26. Januar 2008, 19:40

Einen String kann man mit exec "ausführen", z.B.:

Code: Alles auswählen

a = [3, 5, 10, 13]
exec "for i in a: print i"
Aber obs das so bringt ...
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 26. Januar 2008, 19:47

Hallo

Das geht ja schnell!

@Nikolas
Kannst du mir das bitte näher erklären?
Ich habe noch nicht viel mit Dateien gearbeitet. Die ganzen Tutorials beschreiben nur wie ich den inhalt ausgebe (mal die wo ich gefunden habe).
ich erwarte keine fertige Lösung (ich will ja sagen könne, hab ich gemacht), ein guter verweis (auf Deutsch)recht ja, oder ein code Schnipsel.

@Craven
Ich habe exec gerade ausprobiert. Wenn die Datei eine Zeile hat dann wird die ausgeführt, bei mehr wie einer wird nur die letzt ausgeführt. Wie kann ich das ändern?

Gruß
Andyh
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Samstag 26. Januar 2008, 20:20

Ich glaube, execfile wäre hier doch besser, dann kannst du dir das einzelne auslesen sparen, da du ja eh alle ausführen willst.

Das könnte man z.B. so machen:

Code: Alles auswählen

a = "C:\\dokumente und einstellungen\\craven\\desktop\\a.py"
def asd1():
    print "asd1"
def asd2():
    print "asd2"
def asd3():
    print "asd3"
execfile(a) # einfach einen String mit dem Pfad an execfile übergegen
In der Datei a.py stehen, wie bei dir, die Funktionsaufrufe.

Und jetz erklär mir bitte, wozu du das brauchst. ;)
Zuletzt geändert von Craven am Samstag 26. Januar 2008, 20:29, insgesamt 1-mal geändert.
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Samstag 26. Januar 2008, 20:27

Hallo Andyh!

Wenn du auch nur einen Funken Sicherheit in deiner Anwendung haben möchtest, dann würde ich es nur zulassen, die gegebenen Funktionen auszuführen.

Z.B. so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

# Die zugehörige Textdatei (abc.txt) sieht so aus:
# test1
# test3
# test2


def test1():
    print "ich bin test1"


def test2():
    print "ich bin test2"


def test3():
    print "ich bin test3"


def main():
    
    functions = {
        "test1": test1,
        "test2": test2,
        "test3": test3,
    }
    
    filename = "abc.txt"
    my_file = file(filename, "rU")
    for line in my_file:
        line = line.strip()
        if not line:
            continue
        # Ausführen
        functions[line]()
    
    my_file.close()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 26. Januar 2008, 20:34

Hallo

Danke für die super Lösung!
Habe alles mal wieder viel zu kompliziert gemacht :oops:

Für was ich das brauche:
Ich möchte ein Programm in unterschiedlicher Reihenfolge ablaufen lassen(nur zum testen) und um nicht jedes mal das Programm umschreiben zu müssen will ich es gerne über eine Datei machen.

Ich schon getestet und lauft wie ne 1, besten Dank!

EDIT: Gerold, das ist ja eine feine lösung, Danke

Gruß
Andyh
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Samstag 26. Januar 2008, 22:10

Hmja, viele Wege führen nach Rom, aber eigentlich würde man es wohl eher so machen:

Code: Alles auswählen

import pythondateimitfunktionen

pythondateimitfunktionen.test2()
pythondateimitfunktionen.test1()
pythondateimitfunktionen.test3()

In eine eigene Python-Datei im selben Verzeichnis packen und dann immer nur diese ausführen.
Antworten