Variable in Modul übergeben

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
lemmi82
User
Beiträge: 8
Registriert: Montag 15. Januar 2007, 12:21
Wohnort: Kiel

Hallo zusammen, ich bin absoluter Python-Neuling. Ich möchte Python verwenden, um einen Digital-Analog-Wandler (DAC) anzusteuern.
Dazu möchte ich ein kleines Programm schreiben, in dem ich einen (Spannungs-)wert wähle (DAC6_offset). Dieser Wert soll in ein Modul übergeben werden. Dieses Modul stellt den Wandler dann auf die gewählte Spannung.
Dann soll das Programm von vorne starten, so dass ich sofort eine neue Spannung wählen kann, also eine Schleife. Leider funktioniert es nicht. Vielleicht gibt es hier jemanden, der mir kurz sagen kann, was falsch ist. Danke im Voraus!

Code: Alles auswählen

#!/usr/bin/env python
print 'Voltage Test'
while True:
	global DAC6_offset      #
	DAC6_offset = int(raw_input('Choose Voltage [mV]: ')) 
	if DAC6_offset == 99999:	# Programm beenden, wenn 99999 gewählt wird
		break	
	else:
		import config      # Modul zum Steuern des Wanlders
		config.create_main_window()     
print 'Byby!'
Wenn ich das nun ausführe, dann gibt es zwei Fehler:
1. Ich muss die Spannung zweimal wählen,
2. Dann kommt eine Fehlermeldung:
AttributeError: 'module' object has no attribute 'create_main_window'

Die gesamte Ausgabe lautet:

Voltage Test of DSP-Board
Choose Voltage [mV]: 123
Voltage Test of DSP-Board
Choose Voltage [mV]: 123
Traceback (most recent call last):
File "./vtest.py", line 23, in ?
import config
File "/root/python/config.py", line 49, in ?
from vtest import DAC6_offset
File "/root/python/vtest.py", line 24, in ?
config.create_main_window()
AttributeError: 'module' object has no attribute 'create_main_window'

Was ist da faul?
BlackJack

Du hast einen Kreis bei Deinen ``import``s. Das ist schlecht.

Du gibst die Zahl ein, dann kommt ein ``import config``, der als erstes `vtest` importiert und ausführt, also wirst Du ein zweites mal nach einer Zahl gefragt, dann wird wieder `config` importiert, das es zwar schon gibt, aber das bisher in seiner Ausführung noch nicht über das Importieren von `vtest` hinausgekommen ist, also ist ``def create_main_window():`` auch noch nicht ausgeführt worden, und damit kommt der `AttributeError`.

Solche Kreise kann man z.B. aufbrechen, indem man ein weiteres Modul einführt, das die vorhandenen importieren. Für diesen Verwendungszweck wird dieses gemeinsame Modul oft `config` genannt. Was zu der Frage führt, ob eine Funktion die ein Hauptfenster erzeugt zur Konfiguration gehört oder nicht besser in einem anderen Modul untergebracht werden sollte.

Vergiss am besten das es ``global`` überhaupt gibt und schreibe keinen Code auf Modulebene, der da nicht unbedingt sein muss. Muss dieser Wert überhaupt "global" verfügbar sein? Kannst Du aus `vtest` nicht eine Funktion aufrufen die den Wert setzt mit der Zahl als Argument?
lemmi82
User
Beiträge: 8
Registriert: Montag 15. Januar 2007, 12:21
Wohnort: Kiel

Danke für die Hilfe, ich bin jetzt einen Schritt weiter. Dieses Probloem habe ich nun in den Griff bekommen. Ich melde mich, wenn ich wieder nicht weiter weiß. Aber nochmals danke für die schnelle Antwort!
Antworten