EOF

Mittlerweile kann man Mobiltelefone nach dem Wetter in Chicago fragen und erhält eine sinnvolle Antwort. Andererseits ist es immer noch nicht möglich, ein einfaches Python-Skript zweimal auf demselben Weg mit Daten zu versorgen. Woher ich das weiß? Ein winziger Bug in urlview hat mich bewogen, eine Reimplementierung in Python zu versuchen. Ausgangspunkt war mein funktionierender urlview-Handler –

#!/usr/bin/env python import argparse import subprocess p = argparse.ArgumentParser(description='URL handler for urlview', version='0.1') p.add_argument("url", help="the url to open", type=str) arguments = p.parse_args() if not arguments.url.startswith('http'): url = 'http://' + arguments.url else: url = arguments.url return_code = subprocess.call(['open', url])

– der mit einer kleinen Anpassung als Ziel des pipe-message-Kommandos dienen sollte:

#!/usr/bin/env python import sys import subprocess import re import os message = sys.stdin.read() urls = re.findall(r'(?:http|www)\S+', message) for index, url in enumerate(urls): print '{0}: {1}'.format(index, url) selected_index = raw_input('Which URL to open? ') selected_index = int(selected_index) selected_url = urls[selected_index] if not selected_url.startswith('http'): selected_url = 'http://' + selected_url return_code = subprocess.call(['open', selected_url])

Erst nach zwei halb durchwachten Nächten habe ich mit Unterstützung von Stackoverflow verstanden (und akzeptiert), dass ein EOFError beim Ausführen dieses Skripts unumgänglich ist: Die read()-Funktion liest die von mutt übergebene Nachricht bis zum Signal EOF, wovon sich standard input (zumindest auf dem Mac) nicht mehr erholt. Die Ausführungen der Python-Dokumentation klingen vor diesem Hintergrund wie blanker Hohn:

If sys.stdin is used more than once, the second and further use will return no lines, except perhaps for interactive use, or if it has been explicitly reset (e.g. using sys.stdin.seek(0)).

Ich weiß nicht, wie perhaps in diesem Zusammenhang zu verstehen ist, aber sys.stdin.seek(0) hilft definitiv nicht. Unter Linux lässt sich die Situation mit sys.stdin = open('/dev/tty', 'r') retten. Ob ich den jungen Löwen jetzt schon pensionieren muss? Oder doch wieder zu Perl zurückkehren?