Returncode von os.system() unterdrücken

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
Michaela81
User
Beiträge: 18
Registriert: Samstag 5. September 2020, 18:47

Hallo, ich rufe in einem Programm die Funktion os.system auf um ein externes Programm zu starten, die Ausgabe dieses Programms wird in einer Datei gespeichert. In der Pythonconsole, die nebenher läuft, wird leider der Rückgabecode ausgegeben, was ich als unschön empfinde. Wie kann ich diese Ausgabe verhindern ?
Beispielcode bei dem die Ausgabe wie gewünscht in eine Datei geschrieben wird, leider der Rückgabewert in der Console angezeigt wird.

Code: Alles auswählen

import os
t = "dir > \"f:\out.txt\""
os.system(t)
Bisher die einzige Möglichkeit das zu verhindern ist der untere Code, wenn möglich würde ich es aber gerne vermeiden ein zusätzliches Modul einzubinden.

Code: Alles auswählen

import os
import warnings
warnings.filterwarnings('ignore')

t = "dir > \"f:\out.txt\""
warnings.warn(os.system(t))


Grüße
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Michaela81: Statt os.system() solltest du subprocess.run() verwenden.
In specifications, Murphy's Law supersedes Ohm's.
Michaela81
User
Beiträge: 18
Registriert: Samstag 5. September 2020, 18:47

Super, Danke

Und - zu meiner Schande muss ich gestehen, ich hatte das nur in der Console selber getestet, nicht im Programmcode.
Während in der Console der Rückgabecode ausgegeben wird, habe ich gerade bemerkt das das im Programm selber nicht passiert. Somit ist das sowieso erledigt. Sorry.

P.S.
Werde subprocess.run() trotzdem anschauen.
Michaela81
User
Beiträge: 18
Registriert: Samstag 5. September 2020, 18:47

Ich hatte genau dieselbe 0 als Ausgabe, wie im zweitem Beispiel in diesem Link
Positiv bei subprocess() ist, das man die Ausgabe auch direkt in einer Variablen bekommt und nicht zwischenspeichern muss.
Grüsse, Michaela
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir ist aber schon klar, dass bei interaktiven Eingaben im Interpreter die Ausgaben der Rückgabewerte nicht in laufendem Code passieren?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Michaela81: Wobei man zu `subprocess.run()` noch sagen sollte, dass man dort ``shell=True`` *nicht* verwenden sollte, was zwei Probleme mit dem gezeigten Code bereitet: a) die Umleitung in eine Datei mit ``>`` geht dann nicht, und b) auch ``dir`` geht nicht, weil das kein Programm ist, sondern ein eingebautes Kommando in der Shell.

Code: Alles auswählen

    with open(R"f:\out.txt", "wb") as out_file:
        subprocess.run(["cmd", "/c", "dir"], stdout=out_file, check=True)
Das der von Dir verlinkte Artikel ``shell=True`` verwendet, insbesondere auch bei Beispielen die das gar nicht benötigen, ist äusserst unschön.

Und das Beispiel `dir`/`ls` ist natürlich auch nicht so toll, weil man dafür kein externes Programm starten würde, insbesondere wenn man die Informationen dann im eigenen Programm weiterverarbeiten möchte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Michaela81
User
Beiträge: 18
Registriert: Samstag 5. September 2020, 18:47

@__deets__
Jeetzt ja, vorher . . . (schäm)

@__blackjack__
Danke für den Hinweis. Das mit der Umleitung in eine Datei hatte ich gesehen. In meinem Beispiel hatte ich einfach einen einfachen Befehl eingesetzt, tatsächlich gehts mir um den Aufruf von Mediainfo.exe. Aber auch das mit `shell=True` versuche ich mir zu merken.

Problem ist jedenfalls gelöst, Danke an alle
Antworten