Variablen in einer externen Datei abfragen

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
Taranis
User
Beiträge: 27
Registriert: Freitag 6. Januar 2006, 18:05

Hallo,
Aus Gründen der Übersichtlichkeit habe Ich mal testweise den Teil mit meinem Menü in eine externe Datei ausgelagert.
Mittels

Code: Alles auswählen

choice = raw_input('Eingabe: ')
will Ich nun die Sache steuerbar machen.
Ich kann aber die Variable choice in der Hauptdatei nicht abfragen.
Frage:
Wenn Ich Teile des Codes auslagere und in dem ausgelagerten Code Variable setze, wie kann Ich diese abfragen, bzw. mit den Variablen arbeiten, wenn sich der Hauptcode in einer anderen Datei befindet.

Ich hoffe Ich konnte mich einigermassen verständlich ausdrücken ...

Grüsse
Taranis
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sieh mal auf die Seite [wiki]Modul Import[/wiki], dort wird das erklärt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Wenn ich das, was du tun willst richtig verstanden habe (und du drückst dich nicht besonders verständlich aus), dann kansst du das so machen:

Inhalt der ausgelagerten Datei:

Code: Alles auswählen

thing = raw_input("Input: ")
Speichere das als .py Datei im gleichen Verzeichnis wie die Hauptdatei ab (Beispiel: test_menu.py)
Inhalt der Hauptdatei:

Code: Alles auswählen

import test_menu
# Daraufhin wird der Code ausgeführt
#Mit:
print test_menu.thing
#kannst du dann auf die Varibale zugreifen.
Es funktioniert zwar, ist aber nicht besonder eleganter Code. Besser wäre es dein Menu als Funktion zu definieren...
Taranis
User
Beiträge: 27
Registriert: Freitag 6. Januar 2006, 18:05

Sorry - Hab mich wohl etwas falsch ausgedrückt.

Natürlich befindet sich mein Menü in einer Funktion.
Beispiel:
menu.py

Code: Alles auswählen

def menu():
    print """
    *************************************************************
                     
                (1) Bla
                (2) Blub
                (3) Blubber
   *************************************************************            
    """
    choice = raw_input('Eingabe: ')
Wie fragt man nun die Variable choice ab, ohne dass einem das System sagt: undefined varibale ..., wenn die Abfrage in einer anderen Datei steht?

Danke
Taranis
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Sollte eigentlich wie oben beschrieben funktionieren. Möglicherweise musst du folgendes benutzen:

modulname.menu.choice

Versuchs einfach mal über den Python-Interpreter
BlackJack

Taranis hat geschrieben:Natürlich befindet sich mein Menü in einer Funktion.
Beispiel:
menu.py

Code: Alles auswählen

def menu():
    print """
    *************************************************************
                     
                (1) Bla
                (2) Blub
                (3) Blubber
   *************************************************************            
    """
    choice = raw_input('Eingabe: ')
Wie fragt man nun die Variable choice ab, ohne dass einem das System sagt: undefined varibale ..., wenn die Abfrage in einer anderen Datei steht?
Von aussen kannst Du `choice` nicht abfragen, ganz egal in welcher Datei die Funktion steht. `choice` ist innerhalb der Funktion ein lokaler Name. Sowie die Funktion endet, verschwindet `choice`.

Wieso gibst Du den Inhalt von `choice` nicht einfach als Rückgabewert der Funktion zurück?
Taranis
User
Beiträge: 27
Registriert: Freitag 6. Januar 2006, 18:05

Danke Blackjack,
Ich werde mir mal Funktionen eingeben ...

Grüsse
und eine
schöne Woche
Taranis
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wenn Du schon ein Config-Modul hast, dann mach aus Deiner config.py einfach:

Code: Alles auswählen

def menu():
    global choice, blah, blubb, ...

    choice = <blah>
    <meine weiteren variablen blah, blubb, ...>
und im eigentlichen Modul:

Code: Alles auswählen

import config

print config.choice
print config.<meine weiteren variablen>
--- Heiko.
Zuletzt geändert von modelnine am Montag 16. Januar 2006, 13:49, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

modelnine hat geschrieben:Wenn Du schon ein Config-Modul hast, dann mach aus Deiner config.py einfach:

def menu():
global choice, blah, blubb, ...

choice = <blah>
<meine weiteren variablen blah, blubb, ...>
Nein, bitte keine Globals! Das kann man auf zig andere Weisen lösen. Das scheint zwar die einfachste Lösung zu sein, aber BlackJacks Vorschlag mit den Rückgabewerten ist wesentlich sauberer.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Hmm... Wenn man ein eigenes Config-Modul hat darin globals zu vergeben find ich selbst nicht problematisch, denn wenn ein Programm aus mehr als einer Datei besteht ist es am einfachsten einfach in alle Skripte dieses Config-Modul zu importieren, und auf die Konfiguration mittels der Globals des Moduls zuzugreifen.

Was ich sehr viel eher problematisch finde ist die Tatsache dass der Import des Config-Moduls die Konfiguration auslösen soll...

Kleines Beispiel:

a.py

Code: Alles auswählen

import config

if config.definefunk:
    def funk():
        print "In funk."
main.py

Code: Alles auswählen

import config
# Start Konfiguration.
config.config()

# Rest importieren.
import a

if config.definefunk:
    a.funk()
config.py

Code: Alles auswählen

def config():
    global definefunk
    definefunk = raw_input("Definiere funk in a? [J/N]").lower().startswith("j")
Das ist ungefähr das was der OP will. Was man natürlich anders lösen sollte ist config() von irgendwo aufzurufen. Zum Beispiel indem im config.py-Modul ein Bool gesetzt wird sobald config() einmal gelaufen ist, so dass nicht wieder konfiguriert werden kann.

Aber unabhängig davon, am besten man benutzt etwas was dafür gedacht ist:

http://www.python.org/doc/2.4.2/lib/mod ... arser.html

--- Heiko.
Taranis
User
Beiträge: 27
Registriert: Freitag 6. Januar 2006, 18:05

Danke modelnine - Heiko,
und natürlich alle Anderen -

Nun hab Ich es intus

Grüsse
Taranis
Antworten