Popen überspringt Input in geöffneter datei

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
Interessent00
User
Beiträge: 3
Registriert: Freitag 22. Mai 2020, 18:06

Freitag 22. Mai 2020, 18:22

Hey,

Ich möchte mit Popen eine Datei öffnen. Das funktioniert soweit auch. Der Code dazu lautet:
#!/usr/bin/env python3
#! -*- coding: utf-8 -*-
import shlex, subprocess
print("Willkommen!")
print("Was mochtes du tun?")
print("Verschlusseln oder Entschlusseln? (V/E)")

programm = input()

if programm == "V":
subprocess.Popen("/home/david/Schreibtisch/Crypto.py")
Die Datei Wird geöffnet und es werden auch "prints" ausgegeben. In dem Geöffneten Programm wird dann ein "Input()" ausgeführt.
Das funktioniert aber nicht. Ich kann nichts eingeben, weil das Programm mit der Fehlermeldung
Traceback (most recent call last):
File "/home/david/Schreibtisch/Crypto.py", line 7, in <module>
code = input()
EOFError
beendet wird.
Wenn ich das ausgeführte Programm alleine mit ./Crypto.py starte, funktioniert es einwandfrei.

Was muss ich machen, damit das Programm auf die Eingabe wartet?

Danke im Voraus.
Benutzeravatar
sparrow
User
Beiträge: 1840
Registriert: Freitag 17. April 2009, 10:28

Freitag 22. Mai 2020, 21:34

Warum öffnest du überhaupt eine andere Python-Datei per Subprocess? Das ist in diesem Fall unüblich bis falsch. Eher falsch.
Entweder du machst da ein Modul draus, oder du packst es alles in ein Script.
Interessent00
User
Beiträge: 3
Registriert: Freitag 22. Mai 2020, 18:06

Samstag 23. Mai 2020, 01:21

sparrow hat geschrieben:
Freitag 22. Mai 2020, 21:34
Warum öffnest du überhaupt eine andere Python-Datei per Subprocess? Das ist in diesem Fall unüblich bis falsch. Eher falsch.
Entweder du machst da ein Modul draus, oder du packst es alles in ein Script.
Wieso ist das falsch? Es ist doch auf diese Weise viel übersichtlicher, als alles in eine Datei zu packen.
Benutzeravatar
sparrow
User
Beiträge: 1840
Registriert: Freitag 17. April 2009, 10:28

Samstag 23. Mai 2020, 07:12

Deshalb schrieb ich, dass du Module verwenden sollst. Dafür sind sie da.

In Python gehört auf Modul-Ebene, also Code der nicht eingerückt ist, nur die Shebang- uns die Enconding-Zeile, Importe, die Definition von Funktionen und Klassen, die Deklaration von Konstanten und die Abfrage ob das Script direkt gestartet oder als Modul importiert wurde.
Keinerlei anderer Code.
Gewöhn es dir gleich richtig an, denn hättest du es jetzt schon in Crypto.py richtig gemacht, könntest es einfach als Modul importieren. Module und Dateien schreibt man in Python klein, damit man erkennt, dass es keine Klassen sind. Benenn die Datei also in "crypto.py" um.

Dein Code hier würde dann in etwa so aussehen:

Code: Alles auswählen


#!/usr/bin/env python3
#! -*- coding: utf-8 -*-
import crypto

def main():
    print("Willkommen!")
    print("Was möchtest du tun?")
    print("Verschlüsseln oder Entschlüsseln? (V/E)")
    choice = input()
    if choice == "V":
        crypto.encrypt()
    elif choice == "E":
        crypto.decrypt()
    else:
        print(f"'{choice}' ist keine gültige Auswahl")

if __name__ == "__main__":
    main()
Ist ungetestet.
Und du musst natürlich in crypto.py die Funktionen encrypt und decrypt definieren. Und ansonsten ebenfalls die Datei in eine solche Struktur bringen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 425
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Samstag 23. Mai 2020, 08:39

Wieso ist das falsch? Es ist doch auf diese Weise viel übersichtlicher, als alles in eine Datei zu packen.
Es geht darum, dass du crypt.py mit einem neuen Prozess startest.
Den Code logisch mit Modulen zu trennen, ist schon der richtige Weg.
Also hast du schon mal eine Teillösung.

Der zweite Teil besteht darin, das Modul zu importieren und die vorhandenen Funktionen zu nutzen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Interessent00
User
Beiträge: 3
Registriert: Freitag 22. Mai 2020, 18:06

Samstag 23. Mai 2020, 16:29

sparrow hat geschrieben:
Samstag 23. Mai 2020, 07:12
Deshalb schrieb ich, dass du Module verwenden sollst. Dafür sind sie da.

In Python gehört auf Modul-Ebene, also Code der nicht eingerückt ist, nur die Shebang- uns die Enconding-Zeile, Importe, die Definition von Funktionen und Klassen, die Deklaration von Konstanten und die Abfrage ob das Script direkt gestartet oder als Modul importiert wurde.
Keinerlei anderer Code.
Gewöhn es dir gleich richtig an, denn hättest du es jetzt schon in Crypto.py richtig gemacht, könntest es einfach als Modul importieren.
Ich hab es jetzt mit einzelnen Dateien gelöst. Das nächste Projekt werde ich aber so versuchen wie du schreibst. Vielleicht schreibe ich das aktuelle Projekt auch noch Mal um. Danke :)
Antworten