Drucken aller Shell-Befehle aus Python-Skript, auf Konsole vor dem Ausführen gefeuert

Ich habe ein mäßig großes Python-Skript, das viele Shell-Befehle aus sich selbst ausführt. Ich möchte alle diese Befehle ausdrucken, bevor ich sie ausführe, damit ich den Kontrollfluss des Python-Skripts verfolgen kann.

Nun verwendet das Skript mehrere Befehle, um Shell-Befehle, einschließlich System () von os-Modul, und call (), popen () und check_output () aus dem Subprozess-Modul auszuführen. Was könnte der einfachste Weg sein, dies zu tun?

Ich dachte an eine Wrapper-Funktion, die das Shell-Befehlsargument druckt, bevor es ausgeführt wird, aber ich weiß nicht, wie man eine generische schreiben kann, die den richtigen Anruf / Popen oder einen anderen Befehl wie pro Benutzer diskretion aufrufen kann. Und wir müssen auch bedenken, dass diese Anrufe unterschiedliche Anzahl und Art von Argumenten annehmen.

Vielen Dank!

3 Solutions collect form web for “Drucken aller Shell-Befehle aus Python-Skript, auf Konsole vor dem Ausführen gefeuert”

Erstellen und installieren Sie einen Dekorateur für die verschiedenen Anrufe, die Sie abfangen möchten. Denn auch die "builtin" -Funktionen sind erstklassige Objekte, sie können sie durch Logging-Versionen ersetzen:

import os def log_wrap(f): def logging_wrapper(*args, **kwargs): print("Calling {} with args: {!r}, kwargs: {!r}".format(f.__name__, args, kwargs)) return f(*args, **kwargs) return logging_wrapper os.system("echo 'Hello, world!'") os.system = log_wrap(os.system) os.system("echo 'How do you like me now?!'") 

Dieser Code, wenn ausgeführt (python3) druckt:

 $ python test.py Hello, world! Calling system with args: ("echo 'How do you like me now?!'",), kwargs: {} How do you like me now?! 

Beachten Sie, dass zwischen dem ersten und dem zweiten os.system von os.system die os.system Funktion mit einem ausgetauscht wurde, der eine Log-Meldung os.system , bevor die Argumente an die ursprüngliche Funktion übergeben werden. Sie können Ihre Log-Nachricht in eine Datei ausdrucken oder (noch besser) das logging Modul aufrufen oder den pdb Debugger aufrufen oder was auch immer Sie mögen …

Da du einen Kindprozeß starten willst, aber dein Verhalten protokollierst, musst du den Kinderprozess stdout, stderr,

 import subprocess as sp import datetime dt=datetime.datetime.now().strftime("%Y%m%d%H%M00") ofd = open("res.sql","w+") efd = open("log/cmd-{}.log".format(dt),"a+") 

Angenommen, Sie konstruieren einen Befehl (Beispiel, mysqldump) und Sie haben die Datenbank-, Tabellen- und Anmeldeinformationen Dateinamen (db, tbl, cnf) geladen. Sie möchten den Befehl ausdrucken, den Sie ausführen möchten,

 args = ["mysqldump","--defaults-extra-file="+cnf,"--single-transaction","--quick",db,tbl] print " ".join(args) 

Nun gehen wir davon aus, dass Sie Ausgabe- und Fehlerdateien oben (ofd, efd),

 proc = sp.Popen(args, shell=False, stdin=sp.PIPE, stdout=ofd, stderr=efd) stdout,stderr = proc.communicate rc = proc.wait() if rc>0: print "error",rc,"dbdump failed" else: print "result",stdout,stderr 

Denken Sie daran, sich zu schließen.

 import commands commands = r'''find .''' result = commands.getstatusoutput(command)[0] print("Command: {}\nresult: {}".format(command,result)) 
  • Wie man ein Shell-Skript durch Python ausführt
  • Cd Terminal in einem bestimmten Verzeichnis nach dem Ausführen eines Python-Skripts?
  • Verknüpfen mehrerer Datendateien
  • / Bin / sh: Zeile 62: bis: Befehl nicht gefunden
  • Zufällige Erzeugung von einzigartiger Kombination aus zwei Spalten
  • Python-Skript direkt aus der Befehlszeile ausführen
  • Windows subprocess.Popen eine Batch-Datei ohne Shell = True
  • So erstellen Sie einen Benutzer in linux mit python
  • Rückgabewert von Shell-Befehl in Python erhalten
  • Modifikation von Python-Daemon-Skript, Stop nicht wieder OK (aber tötet den Prozess)
  • Erstellen von Klartext aus einer Wikipedia-Datenbank-Dump
  • Python ist die beste Programmiersprache der Welt.