ich stehe vor folgendem problem:
ich bräuchte auf der kommandozeile eine eingabeaufforderung, wo aber ein startwert auch mitgegeben werden kann
z.B: Bitte geben sie ihren Namen ein: ihr Name
der User sollte dann denn Startwert löschen können und statt dessn einen anderen eingeben können
ich kenne nur die Funktion raw_input(prompt) aber ich bräuchte eben noch etwas wo man startwert auch mitgebn kann
hat da einer ne idee wie man das machen kann?
mfg samy
eingabe mit startwert
So spontan würd' mir nur ein Workaround einfallen:
So is's auch gemütlicher, anstatt zu löschen... für mich zumindest.
Code: Alles auswählen
name = raw_input("Bitte geben sie ihren Namen ein [Default = Foobar]: ")
if not name:
name = "Foobar"
print name
Sofern dein System readline zur Verfügung stellt, kannst du mit input hooks arbeiten:
Funktioniert aber nur auf Systemen, die readline mitbringen. Das wären eigentlich alle Unixe (iirc auch Mac OS X), aber das berühmt-berüchtigte Windows bleibt außen vor, sofern du nicht externe Bibliotheken wie pyreadline mitlieferst.
Ansonsten bleibt dir unter Windows nur der vorgeschlagene Workaround, der zumindest dann sehr problematisch ist, wenn der Nutzer auch leere Werte eingeben können soll (was ich dann im Endeffekt so gelöst habe, dass der Nutzer ohne readline jeden Wert erneut eingeben muss).
Code: Alles auswählen
import readline
def input_hook():
readline.insert_text('Zaphod')
readline.redisplay()
readline.set_pre_input_hook(input_hook)
name = raw_input('Your name please: ')
# remove hook
readline.set_pre_input_hook(None)
print 'Your name is', name
Ansonsten bleibt dir unter Windows nur der vorgeschlagene Workaround, der zumindest dann sehr problematisch ist, wenn der Nutzer auch leere Werte eingeben können soll (was ich dann im Endeffekt so gelöst habe, dass der Nutzer ohne readline jeden Wert erneut eingeben muss).
Nein, readline steht nicht unter der GPL, das gilt nur für die GNU Implementierung. Es gibt andere Implementierungen für andere Systeme, die unter anderen Lizenzen stehen (das erwähnte pyreadline für Windows z.B. unterliegt der BSD Lizenz). Schon allein deswegen sehe ich kein Grund darin, mein Programm unter GPL zu stellen, den durch den darüber liegenden Wrapper kann ich mir ja noch nicht mal sicher sein, ob ich wirklich GNU readline in Python verwende.Joghurt hat geschrieben:Außerdem steht readline unter der GPL, d. h. dein Programm musst dann ebenfalls GPL lizensiert sein! Nicht, dass ich damit ein Problem hätte, aber es ist wichtig, das im Hinterkopf zu behalten.
Nebenbei stehen viele Bindings für andere Sprachen ebenfalls nicht unter der GPL, wie z.B. das Java-Binding (LGPL) und das TCL Binding (BSD).
Und es gibt nicht zuletzt Programme, die zwar readline verwenden, aber ebenfalls nicht unter der GPL stehen (z.B. ncurses, welches der MIT unterliegt).
Außerdem gilt doch für das readline Modul in Python keine Extra-Lizenz (zumindest ist das nirgendwo erwähnt), sondern nur die normale Python-Lizenz.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
getopt ist doch für etwas ganz anderes gut (und außerdem wurde es von optparse unnötig gemacht).samyboy hat geschrieben:hab jetz nen tipp bekommen ich soll getopt verwenden hat wer ne ahnung wie das funktioniert ?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Auf den, der dir das erzählt hat, solltest du nicht mehr hören. getopt hat überhaupt gar nichts mit der Eingabe von der Konsole zu tun, sondern ist für das Parsen von Kommandozeilenargumenten zuständig. Und auch dafür sollte man es nicht mehr einsetzen, optparse ist state of the art für das Kommandozeilen-Parsing. Wie das geht, steht in der Doku...samyboy hat geschrieben:hab jetz nen tipp bekommen ich soll getopt verwenden hat wer ne ahnung wie das funktioniert ?
danke
hab mir jetz schon meine eigene eingabe zusammengebaut so funktionierts:
hab mir jetz schon meine eigene eingabe zusammengebaut so funktionierts:
Code: Alles auswählen
import msvcrt
import time
def cut(s): #schneidet das letzte zeichen des strings s ab
i = len(s)
s = s[0:i-1]
return s
prompt = 'bitte geben sie ihren namen ein: '
startval = 'name'
print prompt
print startval,
inKey = 0
while inKey != 13: #enter
key = msvcrt.getch()
inKey = ord(key)
if inKey == 8: #del
startval = cut(startval)
else:
startval = startval + key
print '\r',
print startval,
print '\n'
print startval
time.sleep(20)