Seite 1 von 1

Ausgabe in Variable packen

Verfasst: Mittwoch 1. März 2006, 12:01
von Stolzi
Hallo,

ich kriege das mit der Docu nicht auf die Reihe. Möchte die Ausgabe von
os.spawnlp(os.P_WAIT, 'ping', 'ping', '-c 1', 'www.westo.at')
in die Variable on packen um dann zu prüfen ob der Host online ist.
on = os.spawnlp(os.P_WAIT, 'ping', 'ping', '-c 1', 'www.westo.at')
funktioniert nicht. Danach gibt print on 0 aus.

Danke
Stolzi

Verfasst: Mittwoch 1. März 2006, 12:18
von jens
Erstens: Ich würde das mit subprocess machen, s.: http://wiki.python.de/Neue_Features?#Subprocess

Zweitens: Warum machst du es nicht direkt über sockets? Wie man jetzt "nur" einen ping macht, weiß ich nicht, aber schau dir mal das an: http://www.python-forum.de/viewtopic.php?t=3262

Verfasst: Mittwoch 1. März 2006, 13:15
von Stolzi
Nein, ich möchte schon das Ping vom OS nehmen. Aber ein Problem habe ich noch. Mit Linux funzt das ganze wunderbar:

Code: Alles auswählen

>>> process = subprocess.Popen('ping -c 1 www.google.de', shell=True, stdout=subprocess.PIPE)
>>> process.wait()
0
>>> print process.stdout.read()
PING www.l.google.com (216.239.59.104) 56(84) bytes of data.
64 bytes from 216.239.59.104: icmp_seq=1 ttl=241 time=69.3 ms

--- www.l.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 69.325/69.325/69.325/0.000 ms
Wenn ich das ganze aber unter Windows durchführe, dann öffnet er die Windows Eingabeaufforderung, führt den Ping aus, schließt sie und ich habe nix in der Variable process :-/

Kann ich dagegen was machen?

Danke

Verfasst: Mittwoch 1. März 2006, 13:17
von jens
Also bei mir geht's... Unter Windows mußt du übrigends statt "-c 1" ein "-n 1" machen...

Verfasst: Mittwoch 1. März 2006, 13:47
von Stolzi
In Windows habe ich die Packets Beschränkung einfach weggelassen, da es eh nur ein paar sendet.
Wie genau hast dus aufgerufen? Egal wie ich probiere es hat bei mir immer den selben Effekt.

Danke

Verfasst: Mittwoch 1. März 2006, 14:09
von jens
Ich hab es direkt mit SciTE, aber auch in der cmd gemacht. Mein Code ist nicht anders als deiner:

Code: Alles auswählen

import subprocess

process = subprocess.Popen('ping -n 1 www.google.de', shell=True, stdout=subprocess.PIPE)
process.wait()

print process.stdout.read()

Verfasst: Mittwoch 1. März 2006, 14:58
von Stolzi
Oh, dann könnte es daran liegen, daß ich nur ein
process = subprocess.Popen('ping -n 1 www.google.de')
gemacht habe, da
process = subprocess.Popen('ping -n 1 www.google.de', shell=True, stdout=subprocess.PIPE)
bei mir folgenden Fehler ergab:

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in -toplevel-
    process = subprocess.Popen('ping -n 1 www.google.de', shell=True, stdout=subprocess.PIPE)
  File "C:\Programme\Python24\lib\subprocess.py", line 533, in __init__
    (p2cread, p2cwrite,
  File "C:\Programme\Python24\lib\subprocess.py", line 593, in _get_handles
    p2cread = self._make_inheritable(p2cread)
  File "C:\Programme\Python24\lib\subprocess.py", line 634, in _make_inheritable
    DUPLICATE_SAME_ACCESS)
TypeError: an integer is required
Weißt du was da bei mir faul ist? In Linux hat genau der selbe Aufruf funktioniert...

Verfasst: Mittwoch 1. März 2006, 15:17
von jens
Also ein shell=True und stdout=subprocess.PIPE muß auf jeden Fall dabei sein...

Die Fehlermeldung ist allerdings sehr merkwürdig! Keine Ahnung woran das liegen kann... Hast du 1zu1 meinen Source-Code genutzt? Dann würde ich sagen, ist vielleicht deine installierte Python-Version broken...

Verfasst: Mittwoch 1. März 2006, 15:30
von gerold
Stolzi hat geschrieben:Weißt du was da bei mir faul ist? In Linux hat genau der selbe Aufruf funktioniert...
Hi Stolzi!

Du bist nicht der Erste, der "subprocess" unter Windows nicht zum Laufen bringt. Deshalb verwende ich weiterhin "popen" für so etwas.

Code: Alles auswählen

u = os.popen("ping www.tirol.at").read().decode(sys.stdin.encoding)
print u.encode(sys.stdout.encoding)
lg
Gerold
:-)

PS: Ich verwende Windows 2000 mit Python 2.4