Seite 1 von 2

befehle an linux shell übergeben!

Verfasst: Freitag 22. April 2005, 10:53
von Gast
Hi @ All,

Ich arbeite gerade an einem Projekt, bei dem ich unter Linux verschiedenste Befehle ausführen muss. aktuelles Beispiel ist die Shell ausgabe in eine Datei umzuleiten. An sich keine schwere sache nur möchte ich dies gerne automatisieren indem ich es python machen lasse! ich habe schon versucht mit dem return Befehl dem system zu sagen was es zu tun hat doch es tut sich nichts! Darum bitte ich um eure Mithilfe! Ich brauche also nur den Befehl, der python einen String (programm /home/xy.ini > /home/xy.txt) an das system übergeben lässt das ihn dann ausführt!

MfG

Christoph Seip

Verfasst: Freitag 22. April 2005, 11:15
von Mr_Snede
In dem Thread Shell Befehl in Python implementieren (der ist im Moment genau unter deinem!)wird "find" aus Python heraus aufgerufen.

cu Sebastian

Verfasst: Freitag 22. April 2005, 11:36
von Gast
Hmm mein Problem liegt eher darin, dass ich nicht direkt einen Shell Befehl, sonder eine ganze Kommandozeile an die Shell übergeben muss. Bei C++ geht das mit return da kann ich dem System einfach etwas zurueck geben! So etwas braeuchte ich! Ich rufe dann zwar auch einen Befehl aus os mit auf allerdings auch ein Programm und 2 unterschiedliche Pfade!

Verfasst: Freitag 22. April 2005, 12:11
von jens

Verfasst: Freitag 22. April 2005, 12:46
von Leonidas
Anonymous hat geschrieben:Bei C++ geht das mit return da kann ich dem System einfach etwas zurueck geben! So etwas braeuchte ich!
Wie soll das gehen? Also das return kannst du in Python auch ganz einfach machen, dass das Programm einen Rückgabewert beim beenden liefert, mit sys.exit(wert).

Verfasst: Dienstag 26. April 2005, 07:59
von Gast
Ok, soweit so gut! Danke schon mal fuer die Muehen! Ich hab jetzt ein Programm, mit dem ich shell kommandos an die shell uebergeben kann! Nur hab ich aus all dem nicht heraus bekommen koennen wie ich denn eine neue Shell oeffne und vorallem wie ich den Pfad wechseln kann! Befehle gehn aber den Pfad kann ich auch mit cd <pfad> nicht wechseln! Bitte daher um Hilfe!!

MfG

Christoph Seip

Verfasst: Dienstag 26. April 2005, 08:53
von jens
Natürlich kann man den Pfad mit cd wechseln... Allerdings nur in der aktuell geöffneten shell... d.h. du kannst Befehre verketten: "cd /;ls" das aktuelle work-dir für das Python-Skript bleibt aber das selbe. Wenn das auch geändert werden soll, mußt du halt ein os.chdir() machen und danach die shell Aufrufen.

Verfasst: Dienstag 26. April 2005, 09:27
von Gast
ahja danke! Jetzt geht es! Aber mit welchem befehl oeffne ich den eine neue shell? Ein Problem hab ich noch! Und zwar versuche ich ein Programm aufzurufen indem ich den command string an die shell uebergebe. Schreib ich es direkt in die Shell hinein funktioniert alles aber wenn ich es ueber python mache passiert nichts er sagt mir nur: "no such file or directory" solangsam aerger ich mich aber schon!

Verfasst: Dienstag 26. April 2005, 09:31
von jens
Hast du dir das http://python.sandtner.org/viewtopic.php?t=2875 mal durchgelesen?

Verfasst: Dienstag 26. April 2005, 09:44
von Gast
Ich habe es mir schon einige male durchgelesen nicht zu sagen studiert *g* aber ich bin leider noch nicht so lange in python unterwegs daher hab ich ca erst 60 % verstanden! Ich kann z.B. subprozess nicht importen da ich den header nicht habe! Ausserdem arbeite ich hier ausschliesslich unter linux und der Thread ist hauptsaechlich fuer Windows! Ich muesste doch nur die genaue syntax am besten anhand eines Beispieles fuer das oeffnen einer neuen shell, das hineinschreiben und das schliessen der Shell vor augen haben und schon wuerd ichs verstehen! Aber was genau an Parametern uebergeben werden muss ist leider nirgends ausfuehrlich beschrieben!

Verfasst: Dienstag 26. April 2005, 11:39
von jens

Code: Alles auswählen

import subprocess

# Kommando der ausgeführt wird
command = "ls -l"

# Befehl ausführen und Rückgabewert auslesen:
process = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE)

# Ausgabe der shell anzeigen
print process.stdout.read()

Verfasst: Dienstag 26. April 2005, 12:58
von Gast
Wo bekomme ich denn das subprocess Modul her?

Verfasst: Dienstag 26. April 2005, 13:20
von Leonidas
Aus Python 2.4 oder von effbot.

Verfasst: Dienstag 26. April 2005, 13:31
von Gast
alles klar danke! Ich haette da nur noch eine Frage und zwar haeng ich gerade an dem Problem! Wie ist es denn moeglich in python einen explizieten referenzparameter anzulegen? Hab zwar jetzt schon gelesen dass sowieso jeder Parameter einer sei aber ich habe gerade das problem, dass ich in einer Funktion einen Wert stehen habe, den ich aber außerhalb der Funktion benoetige! Wie ich den da rausbekomme bevor die funktion fertig ist weis ich nicht!

Verfasst: Dienstag 26. April 2005, 13:43
von Leonidas
Das geht - wenn du die Variable global setzt. Also global variablenname und dann kannst du die Variable verändern - nur sei gewarnt: das ist kein guter Stil und sollte vermieden werden. Funktionen sollten aufgaben erfüllen und sonst hermetisch sein, keine Nebenwirkungen haben.

Verfasst: Dienstag 26. April 2005, 14:02
von Gast
genau das ist mein Problem! Ich glaub ich verzichte auf die Funktion aber dann haette ich n riesigen Quellcode! Mist mit nem referenziellen parameter waer das alles kein Problem! Die Funktion soll bestimmte Verzeichnisse aus einer datei auslesen die Suchkriterien sind immer die gleichen nur der Startpunkt variiert! Somit muss ich eben den Endpunkt nach beenden der Funktion bei erneutem starten als startpunkt verwenden. Aber ohne globale variable bzw RP is da wohl kein Land in sicht wie! Falls jemand doch noch eine Idee haben sollte waer ich sehr dankbar dafuer!

Verfasst: Dienstag 26. April 2005, 14:07
von joe
Du kannst einfach die refs in eine liste (oder auch ein in dictionary) packen und diese dann der funktion übergeben. Siehe auch http://www.python.org/doc/faq/programmi ... -reference
joe

Verfasst: Dienstag 26. April 2005, 14:12
von Gast
Danke fuer den Tip. Habs aber jetzt mal so probiert, dass ich einfach die neue Position als Rueckgabewert an den Parameter uebergeben habe! Mist haett ich auch gleich drauf kommen koennen *g* !

Muss euch echt ein Kompliment aussprechen! Ist eines der besten und hilfreichsten Foren ueberhaupt im Bezug auf Python!

Denke man hoert noch voneinander :-)

Mit freundlichen Gruessen

Christoph Seip

Verfasst: Dienstag 26. April 2005, 16:07
von jens
Leonidas hat geschrieben:Das geht - wenn du die Variable global setzt. Also global variablenname
Dafür benutze ich auch gern mal eine pseudo-Klasse... z.B. für globale Einstellungs-Daten, die an mehreren Stellen benötigt werden. Das ganze läst sich dann auch Auslagern.
z.B.
config.py

Code: Alles auswählen

class dbconf:
    Host = "beispielserver.tld"
    dbname = "meinedatenbank"
    User = ""
main.py

Code: Alles auswählen

from config import dbconf
print "Host:",dbconf.Host
print "dbname:",dbconf.dbname

Verfasst: Dienstag 26. April 2005, 22:07
von BlackJack
Anonymous hat geschrieben:Funktion soll bestimmte Verzeichnisse aus einer datei auslesen die Suchkriterien sind immer die gleichen nur der Startpunkt variiert! Somit muss ich eben den Endpunkt nach beenden der Funktion bei erneutem starten als startpunkt verwenden. Aber ohne globale variable bzw RP is da wohl kein Land in sicht wie! Falls jemand doch noch eine Idee haben sollte waer ich sehr dankbar dafuer!
Ich glaube ich habe Dein Problem noch nicht ganz verstanden. Was muss denn ausserhalb einer Funktion sichtbar sein, bevor die Funktion fertig ist? Wenn das an anderer Stelle gebraucht wird, dann kann man es doch als Parameter übergeben!?