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

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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

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

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: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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

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

@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

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

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

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

@Hyperion:

ich hab das eben mal geändert und meinen Code eingefügt.
Ah ok das mit Python Code habe ich jetzt auch gesehen und geändert

Also wenn ich das Modul verwende bekomme ich, wenn ich es so aufrufe:

Code: Alles auswählen

var= ping.verbose_ping("xxx.xxx.xxx.xxx")
print(var)

# Ergebnis von Print var:
None
Egal ob es erfolgreich war oder nicht ich bekomme gar keinen Rückgabewert wenn ich ihn darübr aufrufe. Ich habe ja versucht das Modul zu manipulieren, doch mache ich da irgendwie etwas falsch und war halt dann der annahme das es doch bestimmt auch in kurzform gibt, daher meine Anfrage.

1. Mein erster Versuch war, eine Globale Variable zu deklarieren (siehe letzten Beitrag), die ich im Nachhinein mit verbose_ping zurückgebe, da diese Funktion anscheinend keinen Rückgabewert hat.
Doch leider ist es mir irgendwie nicht möglich eine globale Variable einzufügen. Gibt es hierzu einen Lösungvorschlag?

Also Prinzipiell habe ich nichts dagegen das Modul zu verwenden, aber wie gesagt ich dachte es geht evtl. auch einfacher da ich ja auch den ganzen schnickschnack theoretisch nicht brauche.
Zuletzt geändert von hammelwade am Donnerstag 8. März 2012, 11:24, insgesamt 1-mal geändert.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich verstehe nicht, was du an try-except so umständlich findest. Wenn ein Fehler auftreten sollte, behandelst du ihn halt direkt statt einen Rückgabewert abzufragen. Deine vereinfachte Lösung (also das Konstrukt mit os.popen) ist auch kein wirklicher ping, weil sie schlicht und ergreifend vollkommen anders funktioniert. Sonst würde ja niemand bei Portscans und anderen Netzwerk-relevanten Geschichten zwischen vollem Aufbau und Absenden einer Ping-Anfrage unterscheiden.
hammelwade
User
Beiträge: 19
Registriert: Dienstag 6. März 2012, 10:11

@webspider:

Weil ich es gewohnt bin mit Rückgabewerten zu arbeiten und wenn ich diesen Schritt geschafft hätte, könnte ich mei Skript warhscheinlich ohne weiteres mit meinem jetzigen wissenstand fertig schreiben.

Ich weiß um ehrlich zu sein nichts mit try-exept anzufangen, also wie ich das abfangen soll oder weiter damit zu arbeiten.
Ich kenne es nur so das ich einen Wert zurück bekomme und damit dann weiter arbeite. Wie kann ich denn mit try-exept arbeiten? ich benötige ja eig nur eine Variable mit Inhalt die ich auswerten kann, wenn das auch mit try-exept funktioniert gerne nur wie?

Ist ja nicht so das ich nicht lernbereit bin, ich weiß nur nicht wonach ich googlen sollte, also ein link zu einem tut der mir genau das erklärt würde ich auch nehmen, oder eine Bezeichnung für den Vorgang damit ich es selber im Inet finde
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Sich der Fehlerbehandlung wegen auf Rückgabewerte zu verlassen, erinnert mich ein wenig an C. Und genau den Stil möchte man doch in Python wo die Betonung auf leserlichen, aufgeräumten Code liegt doch vermeiden, oder etwa nicht?

Wenn ich mit Google nach "python try except" suche, erhalte ich als erstes Suchergebnis den passenden Abschnitt der offiziellen Dokumentation: Errors and Exceptions.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

hammelwade hat geschrieben:Ich kenne es nur so das ich einen Wert zurück bekomme und damit dann weiter arbeite. Wie kann ich denn mit try-exept arbeiten? ich benötige ja eig nur eine Variable mit Inhalt die ich auswerten kann, wenn das auch mit try-exept funktioniert gerne nur wie?
Hier ist ein Beispiel mit dem ein Fehler abgefangen wird und ein entsprechender Wert zurückgegeben wird.

Code: Alles auswählen

def is_ok(number):
    try:
        result = 1 / number
        return True
    except ZeroDivisionError:
        return False

if is_ok(0):
    print '0 ist OK'
if is_ok(1):
    print '1 ist OK'
Antworten