Seite 1 von 1

os.system() ?

Verfasst: Mittwoch 17. September 2008, 20:31
von Rootmentor
Hallo ich möchte dieses shell script ausfrühren lassen.
curl -s www.wieistmeineip.de | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

Code: Alles auswählen

import os
os.system(curl -s www.wieistmeineip.de | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")

Kommt invalid syntax weil er die ][ klammern nimmt

Verfasst: Mittwoch 17. September 2008, 20:49
von Trundle
Und was soll dir das bringen? Mit ``os.system()`` kommst du ja doch nicht an die Ausgabe des Befehls. [mod]subprocess[/mod] würde man da verwenden. Andererseits, warum überhaupt einen externen Befehl ausführen anstatt es mit Python-Bordmittteln umzusetzen?

Verfasst: Mittwoch 17. September 2008, 21:01
von lunar
Nicht mit Bordmitteln, aber pure-python: http://paste.pocoo.org/show/85544/

Was os.system angeht, so vergisst du am besten ganz schnell, dass es diese Funktion überhaupt gibt.

Verfasst: Donnerstag 18. September 2008, 00:22
von abgdf
Hallo,

os.system() ist manchmal schon sehr praktisch.
Bedenke, daß es einen String als Argument verlangt.

Du willst die Ausgabe haben, "subprocess" ist dazu oft overkill. Meist reicht os.popen(). Beispiel:

Code: Alles auswählen

import os

fh = os.popen("ls")
a = fh.readlines()
fh.close()

for i in a:
    print i
HTH

Verfasst: Donnerstag 18. September 2008, 00:39
von Leonidas
abgdf hat geschrieben:Du willst die Ausgabe haben, "subprocess" ist dazu oft overkill.
Wann? ich finde eine Klasse die jede Art von Eingabe und Ausgabe unterstützt nicht overkill. Sie ist auf jeden Fall zukunftssicherer falls man irgendwann auch noch den Rückgabewert haben will oder auf den Kindprozess warten will, oder mit dem Kindprozess kommunizieren will, oder...

Verfasst: Donnerstag 18. September 2008, 07:51
von BlackJack
@abgdf: Wo ist bitte der Overkill?

Code: Alles auswählen

from subprocess import PIPE, Popen

def main():
    ls_process = Popen('ls', stdout=PIPE)
    for line in ls_process.stdout:
        print line
    return_code = ls_process.wait()

Verfasst: Donnerstag 18. September 2008, 15:33
von Rootmentor
Ich wollts doch selber rausfinden ._.
:cry:

Code: Alles auswählen

def get_my_ip():
    """
    Returns the external ip address as tuple of four integers.  The ip
    is parsed from http://www.wieistmeineip.de.
    """
    with closing(urlopen('http://www.wieistmeineip.de')) as stream:
        tree = lxml.html.parse(stream)
    el = tree.getroot().get_element_by_id('ihre_ip').find_class('ip')[0]
    return map(int, el.text_content().strip().split('.'))

jetzt musst du mir nur noch erkärn wie man ein html Dokument splittet
oder hast du zufällig was zum lesen parat?

Verfasst: Donnerstag 18. September 2008, 17:23
von Hyperion
Rootmentor hat geschrieben: jetzt musst du mir nur noch erkärn wie man ein html Dokument splittet
oder hast du zufällig was zum lesen parat?
Was bedeutet "splittet"? Das Dokument oder die DOM-Struktur?

Verfasst: Freitag 19. September 2008, 10:20
von lunar
abgdf hat geschrieben:os.system() ist manchmal schon sehr praktisch.
Im Gegenteil, diese Funktion ist äußerst unpraktisch. Man kann noch nicht mal auf portable Weise Fehler abfangen, weil der Rückgabe von os.system von der darunter liegenden libc anhängt, die je nach System unterschiedlich ist. Meines Wissens ist system() zwar POSIX-Bestandteil, der Rückgabewert dieser Funktion ist allerdings nicht spezifiziert, so dass man ihn nicht vernünftig auswerten kann.

subprocess dagegen wirft Ausnahmen, die man vernünftig abfangen und dementsprechend behandeln kann.

Von Shell Injection-Lücken oder ähnlichen Scherzen mal ganz abgesehen ...

Sorry, aber os.system hat in guten Code nichts zu suchen.