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

os.system() ?

Beitragvon Rootmentor » Mittwoch 17. September 2008, 20:31

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

Beitragvon Trundle » Mittwoch 17. September 2008, 20:49

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

Beitragvon lunar » Mittwoch 17. September 2008, 21:01

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

Beitragvon abgdf » Donnerstag 18. September 2008, 00:22

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 18. September 2008, 00:39

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 Modvoice
BlackJack

Beitragvon BlackJack » Donnerstag 18. September 2008, 07:51

@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:

Beitragvon Rootmentor » Donnerstag 18. September 2008, 15:33

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: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Donnerstag 18. September 2008, 17:23

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

Beitragvon lunar » Freitag 19. September 2008, 10:20

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]