Ausgabe in Variable packen

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.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Ausgabe in Variable packen

Beitragvon Stolzi » Mittwoch 1. März 2006, 12:01

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
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 1. März 2006, 12:18

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Mittwoch 1. März 2006, 13:15

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
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 1. März 2006, 13:17

Also bei mir geht's... Unter Windows mußt du übrigends statt "-c 1" ein "-n 1" machen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Mittwoch 1. März 2006, 13:47

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
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 1. März 2006, 14:09

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()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Mittwoch 1. März 2006, 14:58

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...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 1. März 2006, 15:17

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 1. März 2006, 15:30

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
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]