Diverses zu Importen/ssh und scp/_DEBUG_/ping

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.
Antworten
stielchen
User
Beiträge: 14
Registriert: Sonntag 27. Juli 2014, 09:28

Hallo zusammen,
ich habe als Einsteiger mal ein paar Fragen, habe diese einfach mal in ein Thema gepackt, weil ich denke, dass es nicht lohnt jeweils ein eigenes dafür aufzumachen. Vielleicht könnt ihr mir ein paar Hinweise geben?

1) Import
Da ich als Python-Neuling motiviert bin, mir gleich einen guten Programmierstil anzueignen, mal eine Frage zu den Importen. Diese werden, soweit mir nun bekannt, mit "import <Python-Datei>" formuliert.
Dabei wird die zu importierende Datei ja (Reihenfolge weiß ich aber nicht):
- zuerst im aktuellen Verzeichnis gesucht und dann
- in den PATH-Verzeichnissen.

Kann man denn beim import-Befehl auch einen Pfad mitgeben? Meine Versuche diesbezüglich scheinen das zu verneinen.
Zum Beispiel hätte ich gerne mein Hauptprogramm im Verzeichnis "D:\Beispiel" und die importe des Hauptprogramms im Verzeichnis daraunter, also "D:\Beispiel\imports" abgelegt, so dass im Programmverzeichnis möglichst wenige *.py-Dateien stehen. Lässt sich das realisieren oder wie löst man das i.d.R. sauber in Python? Werden die Import-Dateien eigentlich in der finalen Version eigentlich als *.py oder als *.pyc-Dateien zur Verfügung gestellt?

2) ssh/scp
Gibt es eigentlich eine empfehlenswerte Python-Bibliothek die ssh/scp-Funktionalität zur Verfügung stellt? Gefunden habe ich an externen Bibliotheken "paramiko", "pexpect" und "pyssh", habe diese aber noch nicht getestet. Idealerweise würde ich mich aber lieber bei den Standardbibliotheken bedienen, sofern vorhanden.

3) _DEBUG
Während der Codierung meines Projektes habe ich mir mal erlaubt eine globale Variable "DEBUG" zu definieren, die mir je nach Inhalt die Programmausgabe entsprechend anders gestaltet.
In diesem Zusammenhang bin ich auf den internen Bezeichner "_DEBUG" gestoßen, dieser scheint nur über die "-O"-Option beeinflussbar zu sein. Ich vermute, damit ist nicht eine Option in der Aufrufzeile gemeint, das hat jedenfalls nicht funktioniert. Wofür wird dieser denn verwendet? Kann ich den evtl. auch für eigene Zwecke verwenden um den Programmablauf zu beeinflussen. Ist "_DEBUG" sowas wie eine Compiler-Direktive?

4)
Gibt es in Python sowas wie eine eingebaute Ping-Funktion? Bislang nutze ich immer "os.system('ping <host>')", aber vielleicht gibt es noch eine aus eurer Sicht bessere Variante Funktionen des Netzwerks zu nutzen. Oder ist das so der übliche Weg in Python viel mit Betriebssystemkommandos zu arbeiten?

Noch ein Nachtrag:
5)
Weiß jemand, wie man während der Laufzeit den Namen der aktuellen Funktion ermitteln kann?
Im folgenden Aufbau muss ich leider explizit das "hallo.__name__" angeben, lässt sich das ggf. allgemeiner formulieren?

def hallo():
print "Ich bin in " + hallo.__name__
hallo()

Ausgabe:
Ich bin in hallo

Toll wäre, wenn ich z. B. einmal eine Funktion WoBinIch() schreiben könnte, die von mehreren Funktionen zu beginn aufgerufen wird und ausgibt, wo sich der IP gerade befindet. Also ohne jedesmal eine extra angepasste Print-Anweisung anzugeben.

Danke für die Unterstützung und schöne Grüße
stielchen
BlackJack

@stielchen: Was ``import`` macht steht in der Dokumentation: The ``import`` Statement.

Pfade kann man nicht angeben. Du kannst Pfade zu `sys.path` hinzufügen, wobei man damit nicht übertreiben sollte.

Bei Programmen die aus mehr als einem Modul bestehen sollte man IMHO sowieso überlegen die in ein Package zu stecken. Dann kann man die eigenen Module *eindeutig* identifizieren und läuft auch nicht Gefahr, dass andere Module oder Packages die falschen Module importieren weil die zufällig den gleichen Namen haben wie eines aus dem eigenen Programm.

Ausliefern sollte man IMHO ``*.py``-Dateien. ``*.pyc``-Dateien sind weniger flexibel, funktionieren nicht garantiert über Minor-Versionen hinweg, und ich weiss nicht ob's noch so ist, aber da waren zumindest in der Vergangenheit mal Pfadangaben kodiert.

`pexpect` hat erst einmal nichts mit SSH zu tun. Man kann damit externe Programme ausführen und mit denen Kommunizieren, wobei `pexpect` denen ein virtuelles Terminal vorspielt. Das kann bei `ssh` wichtig sein, weil das zum Beispiel interaktive Passworteingaben nur von einem Terminal entgegen nimmt und nicht über eine Pipe.

Wenn es um die Programmausgabe abhängig von einem DEBUG-Flag geht, würde ich eher auf das `logging`-Modul verweisen. Da macht man die Ausgaben dann mit `debug()`-Aufrufen, und je nach dem welcher Loglevel eingestellt wurde, werden die dann tatsächlich gemacht oder eben nicht.

Eine eingebaute Ping-Funktion gibt es nicht. Dazu müssten Python-Programme zu viele Rechte besitzen. Das ``ping``-Programm hat unter Linux das SUID-Bit gesetzt, dass heisst das wird von *jedem* Benutzer mit Root-Rechten ausgeführt. Ping-IP-Pakete sind auf einer ”Protokollebene” die normale Benutzer nicht nutzen dürfen.

`os.system()` sollte man nicht benutzen. Die Dokumentation verweist da ja auch auf das `subprocess`-Modul.

Was meinst Du mit ”Funktionen des Netzwerks”?

Üblich würde ich das aufrufen von Betriebsystemkommandos nicht bezeichnen. Wenn man so etwas zu ausgiebig macht, dann ist Python wahrscheinlich nicht das passende Werkzeug. Dann sollte man vielleicht eher Batch-, Powershell-, Bash-Skripte, oder etwas vergleichbares verwenden.
Antworten