Verständnisfrage:

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.
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

Dienstag 6. März 2012, 10:44

Hallo,

ich bin neu in der Python Welt und habe vorher bisher immer nur mit AutoIt gearbeitet, doch nun muss ich ein Skript für Linux schreiben und komme an einer Stelle grade nicht weiter...
Ich schreibe ein Skript, welches mehrere Rechner im Netzwerk aus einer Liste heraus pingt und die ereichbaren Hosts wiederum in eine andere Liste einträgt, dabei habe ich die implementation ping.py im Internet gefunden, die den Ping befehl mitsich bringt. Nur weiß ich leider nicht wie ich diese einbinde?! mag vielleicht daran liegen das ich den Namen dafür nicht kenne und ich somit nichts bei google oder in meinem Python Buch finde.

Also hier meine Fragen:
1. Was ist z.B. diese Implementation ping.py ein Modul, Library oder wie nennt man das?
2. Wie kann ich die einbinden abgesehen vom import Befehl, den kenne ich.(also wohin muss ich diese Datein kopieren)?
3. Welche Dateien davon muss man kopieren? alle? da eine Menge Dateien dabei sind, aber welche sind Relevant zum einbinden?

Liste der Dateien:
AUTHORS
LICENSE
MANIFEST.in
ping.py
PKG-INFO
README.creole
setup.cfg
setup.py

ich würde sagen ich brauche nur die .py aber da bin ich mir nicht sicher, beim versuch die ping.py in den lib Ordner von Python zu kopieren, konnte den ping Befehl dennoch nicht nutzen.

LG

hammelwade
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 6. März 2012, 11:20

Willkommen zu Python und im Forum!

Erstmal eine Gegenfrage: Wo hast du diese Dateien denn her?

Dann: Bitte kopiere nichts sondern nutze `setup.py`, d.h. `python setup.py install`.

Wie du das Modul (so heisst ping, die Unterscheidung zwischen Bibliothek und Anwendung gibt es auf Dateiebene erstmal nicht) genau anwendest, haengt davon ab, wie es intern aussieht. Hier muessten wir wissen woher du die Dateien hast.

Nehmen wir mal an, ping hat eine Funktion namens `ping`, die einen Hostnamen bzw eine IP entgegen nimmt, dann sieht die Benutzung so aus:

Code: Alles auswählen

import ping
ping.ping('localhost')
# oder du importierst die Funktion direkt
from ping import ping
ping('localhost')
Benutzeravatar
snafu
User
Beiträge: 5800
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 6. März 2012, 11:22

Ping-Befehl? Du wirst wenn schon die Datei `ping.py` als Modul importieren müssen und von dort heraus sich noch eine entsprechende Funktion aufrufen müssen. Was genau funktioniert denn nicht? Was hast du eingegeben und wie lautet die Fehlermeldung (wenn es eine gibt)?
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dienstag 6. März 2012, 11:23

Hallo,

zu 1.:Ich vermute, es handelt sich um ein Modul. Ohne Quellenangabe ist das allerdings schwierig zu beantworten. 'ping.py' schwirren viele im Netz...
zu 2.:Ich würde 'ping.py' erstmal ins selbe Verzeichnis wie das Script, das darauf zugreift, kopieren. Wenn Du das später systemweit verwenden möchtest, kopierst Du 'ping.py' in das Verzeichnis, in dem sich Deine Pythonmodule befinden, bei mir ist das '/usr/lib/python2.6/' oder in ein Verzeichnis, das von Python durchsucht wird, wenn Du die 'import'-Anweisung ausführst.
zu 3.:Siehe 'zu 1.'. Aus der Ferne würde ich sagen, 'ping.py' ist die Datei, die Du benötigst...
hammelwade hat geschrieben:... beim versuch die ping.py in den lib Ordner von Python zu kopieren, konnte den ping Befehl dennoch nicht nutzen.
Der Modulname 'ping.py' lässt nicht darauf schließen, wie die Funktionen, Klassen, Attribute und sonstiges heißen. Da musst Du schon in die Dokumentation oder gleich ins Modul hineinschauen.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 6. März 2012, 11:25

Ist das dieses Paket? Das fand ich bei der Suche nach ``ping`` via pypi.python.org. Insofern sollte das auch per ``pip`` oder ``easy_install`` installierbar sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

Dienstag 6. März 2012, 11:47

erstmal danke für die schnellen Antworten :)

also ich habe das Paket von folgender Seite:
http://www.g-loaded.eu/2009/10/30/python-ping/
Und hier der Downloadlink
http://pypi.python.org/packages/source/p/python-ping/

@cofi:
Ich Programmiere das Skript derzeit unter Windows, da ich dann auch im Zug ect. daran auf meinem Lappi arbeiten kann.
Unter Windows funktioniert aber "python setup.py install" nicht oder ? habs dummerweise mal in der "cmd" versucht hat nicht funktioniert, hab ich aber auch nicht erwartet.

@snafu:
ich wusste halt nicht wie ich die Datei einbinde bzw. dann benutze, klar jetzt wo gesagt wurde kopier sie in das Verzeichnes deines Skripts sollte der Teil funktionieren(schlimm wie schnell man solche Grundlagen vergessen kann, wenn man mal 3 Monate nichts mit Skripts macht...)

@mutetella:
Was ich aus dem Quelltext von link1 herauslese, benutze ich die funktion wie folgt: verbose_ping("") nachdem ich es einfach mit einem import ping eingebunden habe richtig? (teste ich aber gleich aus)

@Hyperion:
Siehe Link
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dienstag 6. März 2012, 11:56

@hammelwade:

Code: Alles auswählen

>>> import ping
>>> verbose_ping
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'verbose_ping' is not defined
>>> ping.verbose_ping
<function verbose_ping at 0x7face08f2578>
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
jaessyfizzle
User
Beiträge: 6
Registriert: Freitag 24. Februar 2012, 21:45

Dienstag 6. März 2012, 11:58

Unter Windows funktioniert aber "python setup.py install" nicht oder ? habs dummerweise mal in der "cmd" versucht hat nicht funktioniert, hab ich aber auch nicht erwartet.
Also bei mir funktioniert das eigentlich genauso wie du es beschreibst, ich arbeite auch unter Windows. Bist du denn auch in den richtigen Pfad (z.B. cd C:\Python27) gegangen, bzw. hast den Pfad richtig gesetzt.

Nachdem du dann "python setup.py install" ausgeführt hast, kannst du in deinem Skript das Modul per import einbinden, so wie cofi es schon gezeigt hat.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 6. März 2012, 12:41

jaessyfizzle hat geschrieben:
Unter Windows funktioniert aber "python setup.py install" nicht oder ? habs dummerweise mal in der "cmd" versucht hat nicht funktioniert, hab ich aber auch nicht erwartet.
Also bei mir funktioniert das eigentlich genauso wie du es beschreibst, ich arbeite auch unter Windows. Bist du denn auch in den richtigen Pfad (z.B. cd C:\Python27) gegangen, bzw. hast den Pfad richtig gesetzt.
Das gilt fuer den Python-Interpreter, fuer die `setup.py` muss natuerlich auch der richtige Pfad (also `C:\path\to\setup.py`) benutzt werden.
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

Dienstag 6. März 2012, 13:40

ich habe es mal mit vollem Pfad ausgeführt und nochmal als ich den Inhalt einfach in den Python Ordner kopiert habe, bekomme in beiden fällen den gleichen fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "setup.py", line 19, in <module>
    from setuptools import setup, find_p
ImportError: No module named setuptools
Dann habe ich grade einfach die ping.py in das Verzeichnis meines Skripts kopiert und nach mutetella's angabe angesprochen und es funktioniert, ich konnte erfolgreich meine anderen Rechner anpingen.
Ich werde also fürs erste diese Methode wählen, da ich erstmal zusehen muss das ich voran komme.

Aber danke für die Hilfe, melde mich wieder, wenn ich beim nächsten Problem hängen bleibe :D

EDIT: hmm ich benötige für mein Skript einen rückgabewert von ping, also obs erfolgreich war oder nicht, doch bekomme ich leider keinen wert wenn ich folgendes mache:

Code: Alles auswählen

var = ping.verbose_ping("192.168.xxx.xxx")
print(var)
bekomme nur "None" zurück. Ich hab mir den Quellcode angeschaut, mir fällt aber kein einfacher Weg ein einen zu erzeugen. Kennt einer von euch eine bessere ping Variante die einen Rückgabewert mitgibt oder evtl. eine andere Lösung dafür ?
deets

Dienstag 6. März 2012, 14:25

Steht doch da:

Code: Alles auswählen

        try:
            delay  =  do_one(dest_addr, timeout)
        except socket.gaierror, e:
            print "failed. (socket error: '%s')" % e[1]
            break
 
Du versuchst nen ping, und wenn die exception fliegt weisst du, dass der nicht erreichbar ist. Mit dem delay kannst du dann auch noch rumspielen, wenn's noetig ist.
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

Dienstag 6. März 2012, 14:55

@deets

ja das er mir das visuell anzeigt sehe ich, aber ich bin es gewohnt mit den Rückgabewerten der Funktion zu arbeiten oder macht man das in Python nicht so ?

d.h. wenn ich eine Funktion mit

Code: Alles auswählen

testvariable = ping.verbose_ping("")
ausführe, dann möchte ich wenn ich

Code: Alles auswählen

print(testvariable)

eintippe, einen wert wie 0,1,true oder false bekommen damit ich mit diesen Werten weiter arbeiten kann, da ich ja eine Liste ab arbeiten will und jedes mal wenn der Rückgabewert false ist soll der Rechner aus der Liste entfernt werden.

oder habe ich jetzt einfach nur falsch verstanden was du mir sagen wolltest?
deets

Dienstag 6. März 2012, 15:03

ja, du hast das falsch verstanden.

die verbose_ping-methode ist eben nicht so programmiert, dass sie einen rueckgabewert liefert. sie hilft dir also nicht. aber *in* ihr siehst du den code, der einen ping ausfuehrt, und kannst sehen, wie kommuniziert wird, dass er unerfolgreich war: als exception. denn der *rueckgabewert* von do_one ist der delay - aber wenn der host nicht erreichbar war nach einem timeout, gibt's eine exception. das ist genau der code-ausschnitt, den ich dir gepostet haben.

das ist ein standard-idiom der programmierung, wie man fehler kommuniziert, und wenn du das noch nicht beherrschst, dann solltest du dich da mal mit dem python-tutorial zu beschaeftigen.

natuerlich kannst du diesen ausschnitt wiederum in eine eigene funktion stecken, die nur True/False zurueckgibt, wenn dich der delay nicht interessiert.
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

Donnerstag 8. März 2012, 10:48

Ok,

ich hab mir das Skript genauer angeschaut und versucht es an einigen Stellen zu manipulieren, was aber nicht erfolgreich war. Ich bekomme bei jeder Manipulation immer einen Einrückungsfehler am Tab oder Leertaste liegt es nicht, das habe ich probiert. Ich habe zum Beispiel versucht eine Globale Variable zu erstellen und an den richtigen Stellen diese mit true oder false gefüllt, funktioniert aber aus mir nicht ersichtlichem Grund nicht.

bsp. in der do Funktion

Code: Alles auswählen

if receive_time:
            self.receive_count += 1
            delay = (receive_time - send_time) * 1000.0
            self.total_time += delay
            if self.min_time > delay:
                self.min_time = delay
            if self.max_time < delay:
                self.max_time = delay

            self.print_success(delay, ip, packet_size, ip_header, icmp_header)
            global rueckgabeWert # hier meine manipulation
            rueckgabewert = true
            return delay
else:
            global rueckgabeWert # hier meine manipulation
            rueckgabewert = false
            self.print_failed()
Im Prinzip suche ich eigentlich nur nach eine "Reinen" ping Befehl, ich brauche den ganzen schnickschnack mit Paketgröße usw. nicht. Mir reicht es aus wenn ich einfach nur einen ping mache und einen Rückgabewert von 0 und 1 bekomme.

Aber wenn ich mir das Skript anschaue, werde ich leider nicht sonderlich schlau wo jetzt genau der Ping Befehl liegt.

Ich habe noch eine weitere Variante ausprobiert und zwar folgende,

Code: Alles auswählen

import os

def ping(ip):
    data = os.popen(ip).read()
    if 'request timed out' in data or 'unknown host' in data:
        return false
    else:
        return true

var= ping("xxx.xxx.xxx.xxx")
print(var)
natürlich habe ich das ganze in eine Funktion gepackt die IP eingesetzt und einen Rückgabewert gebildet, doch scheint dies auch nicht zu funktionieren, ich bekomme immer ein true zurück.

hat jemand einen stumpfen ping Befehl der mir einfach nur sagt ob der Ping ok war oder nicht. Alle weiteren Fehlerhandlings usw. mache ich auf meine Art und für mich verständlicher als das Skript, welches ich gefunden habe.
Zuletzt geändert von hammelwade am Donnerstag 8. März 2012, 11:09, insgesamt 3-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 8. März 2012, 10:56

hammelwade hat geschrieben: Ich habe noch eine weitere Variante ausprobiert und zwar folgende,
...
natürlich habe ich das ganze in eine Funktion gepackt die IP eingesetzt und einen Rückgabewert gebildet, doch scheint dies auch nicht zu funktionieren, ich bekomme immer ein true zurück.
Wieso zeigst Du uns nicht den von Dir verwendeten Code, sondern das "Urgerüst"? Zudem ist da etwas beim Einfügen schief gelaufen... die EInrückungen sind ja trotz Code-Tags kaputt! (Nebenbei haben wir hier für Python spezielle Code-Tags - in der Button-Leiste bei mir gleich unter "B" und "i" :-) )

Allgemein nutzt man heutzutage das ``subprocess``-Modul für solche Sachen.

Und sehr robust sieht mir das nicht aus! Ich kenne nun nicht alle denkbaren Szenarien von Ausgaben von ``ping``, aber ob das so ausreichend ist? Hat ``ping`` denn keinen Rückgabewert, wenn es scheitert? Das wäre doch der sinnvollere Weg, das anzugehen.

Mir ist abschließend nicht klar, wieso Du das ursürüngliche Modul nicht nutzen willst? Das sollte doch am einfachsten sein...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Antworten