os.system() ?

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
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

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
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
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.
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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()
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
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.
Antworten