os.popen() fehler

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
Rotmilan
User
Beiträge: 32
Registriert: Mittwoch 30. Dezember 2020, 21:59
Wohnort: Nordbayern

Hallo
ich bin dabei ein Scheduler-programm in Python zu schreiben, welches mir andere Python-Programme ausführen soll. Jetzt habe ich zum ausführen des anderen Python-programms den so.popen() befehl benutzt.
Mein "Haupt"-Programm wird ohne Fehler ausgeführt. Jedoch läuft das von popen() gestartete "Unter"-Programm offensichtlich nicht fehlerfrei nicht durch.

Ich habe jetzt nach der Meldung "os._wrap_lose object at" gesucht und habe da auch einen Hinweis auf die Firewall gefunden. Aber ich weiß nicht wie ich das Problem näher eingrenzen soll. [edit: ... geschweige denn was ich wo an der Firewall herumschrauben müsste - die ist auf Fedora immer noch ein Buch mit sieben Siegeln]

Ich benutze Fedora 32, und habe den folgenden Codeschnipsel in PyCharm ausgeführt.
Die Befehlszeile, die ich in popen nutze, funktioniert im Terminal fehlerfrei und auch das "Unter"-Programm wird dort bei direktem Aufruf fehlerfrei ausgeführt - nur der Umweg über popen() scheint nicht zu funktionieren. Was ich auch eindeutig an der Logdatei des anderen Programms erkennen kann.

Programschnipsel zum testen des popen()-Befehls:

Code: Alles auswählen

import os
program = '/home/aaa/PycharmProjects/bbb/ccc.py'
print(os.popen(program))
Ausgabe:

Code: Alles auswählen

<os._wrap_close object at 0x7f88feb60f70>

Process finished with exit code 0
LG und schönen Sonntag noch!
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was erwartest Du denn, was passiert?

Und was willst Du eigentlich machen?
os.popen sollte man nicht benutzen, wenn man nicht genau weiß, dass am es braucht. Schau Dir das subprocess-Modul an.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Rotmilan: Das ist keine ”Meldung” sondern *Deine* Ausgabe des Objekts das `os.popen()` als Rückgabewert liefert. Die Dokumentation von der Funktion ist etwas mau und weist eigentlich ziemlich deutlich darauf hin das man lieber das `subprocess`-Modul benutzen möchte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Rotmilan
User
Beiträge: 32
Registriert: Mittwoch 30. Dezember 2020, 21:59
Wohnort: Nordbayern

ok, danke euch beiden, werde mir das subprocess-modul mal anschauen. Ich melde mich dann noch mal. Dennoch möchte ich vorhab noch mal schnell konkret darauf eingehen, was ihr geschrieben habt:

@Sirius3: ich wollte dass durch den o.g. Code das Programm "'/home/aaa/PycharmProjects/bbb/ccc.py" gestartet und ausgeführt wird - es enthält eine Routineaufgabe, und schreibt eine Meldung in eine log-Datei.

@__blackjack__: ja, ich meinte natürlich Rückgabewert (Rückmeldung - Meldung). Entschuldigung, es wird wohl noch ein bisschen dauern, bis ich alle Begrifflichkeiten intus habe :-))
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was spricht dagegen, das Python-Modul einfach zu importieren?
Rotmilan
User
Beiträge: 32
Registriert: Mittwoch 30. Dezember 2020, 21:59
Wohnort: Nordbayern

Ok, mit dem subprocess hat es jetzt funktioniert. Das hat mir dan (vermutlich zusammen mit dem wait) den eigentlichen Fehler angezeigt: Nämlich, dass ein import in dem auszuführenden Programm nicht funktioniert hat. Allerdings eben nur wenn ich das über das Skript gestartet habe. Irgendwas war da in den PyCharm-Einstellungen in den unterschiedlichen Projekten anders - ich hab das dann quick and dirty gelöst und das funktionierende PyCharm-Projekt kopiert und meine .py-Dateien aus dem nicht funktionierenden Projekt da rein kopiert. Und schon wurde auch der entsprechende import gefunden.
Mit den Modulen, wo die je nach Ausführungsort und -Art verfügbar sind, leuchtet mir immer noch nicht ganz ein - vor allem auch wie PyCharm das handhabt... aber egal - irgendwann krieg ich das noch raus...

Hier zumindest der funktionierende Code, den ich in mein eigentliches Programm entsprechend angepasst implementiert habe:
(Persönliche daten sind mit xxx überschrieben)

Code: Alles auswählen

import subprocess
program = '/home/xxx/PycharmProjects/xxx/main.py'
runningprogram = subprocess.Popen(program)
print('Rückgabewert:',runningprogram.wait())
LG!
Rotmilan
User
Beiträge: 32
Registriert: Mittwoch 30. Dezember 2020, 21:59
Wohnort: Nordbayern

Hallo snafu,

du hast Recht, das scheint auch eine Lösung zu sein, aber das ist leider nicht nur ein Modul, sondern ein aufwändigeres, komplettes Programm, da müsste ich dann auch wieder umschreiben. Außerdem finde ich es ganz sympatisch das so zu lösen, schon allein der Übung wegen. ;-)
Wer weiß, wenn ich mal noch weiter fortgeschritten bin, dann finde ich das ja vielleicht auch blödsinnig, wie ich das jetzt gemacht habe ;-)

LG
Antworten