import os? Externer Programmaufruf

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
Marillus
User
Beiträge: 11
Registriert: Montag 22. Dezember 2014, 21:36

Hallo,

ich habe bereits viel Recherchiert, und umso mehr ich gelesen habe, desto weniger wusste ich was ich nun machen muss.

Ich möchte gerne eine virtuelle Tastatur mitöffnen, wenn mein Pythonprogramm startet.

Herrausgefunden habe ich bereits, dass ich das Modul "os" aufrufen muss. Angeblich soll das dann sehr einfach sein:

Code: Alles auswählen

import os
os.execl("C:/usr/share/matchbox","/usr/share/matchbox")
Ich habe lediglich den Pfad angepasst und dann das Programm gestartet. Aber er gibt mir dann immer Fehlermeldungen aus.
Auch als ich das mit dem Befehl "os.system("...") probiert habe. Komisch ist auch, dass meine Tastatur an 2 verschiedenen Pfaden liegt, welchen muss ich da nehmen? Der andere lautet: /etc/matchbox

Kann mir jemand weiterhelfen und sagen was ich falsch mache? Das wäre super =)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Marillus: Programme startet man z.B. mit subprocess.Popen, und wo Dein Programm liegt, mußt Du schon selbst wissen (normalerweise unter /usr/bin/...)
BlackJack

@Marillus: Zum starten von externen Programmen sollte man das `subprocess`-Modul verwenden. Unter ``/etc/`` liegen aller Regel keine Programme sondern Konfigurationsdaten. Und ich glaube auch nicht das ``/usr/share/matchbox`` das Programm ist, denn unter ``/usr/share/`` liegen in der Regel Daten die von Programmen benötigt werden, wie Grafiken, übersetzte Texte für die Anzeige und so weiter. Das virtuelle Keyboard der `matchbox`-Umgebung heisst `matchbox-keyboard` und die Programmdatei liegt wie die meisten Benutzerprogramme in ``/usr/bin/``. Es gibt eine Manpage die unter ``/usr/share/man/man1/`` liegt, Datendateien für verschiedene Keyboard-Layouts unter ``/usr/share/matchbox-keyboard/``, und ein kleines Keyboard-Icon unter ``/usr/share/pixmaps/``.

Was das 'C:' in dem Pfad bei Dir zu sichen hat ist mir ein Rätsel, denn Laufwerksbuchstaben gibt es unter Linux/Unix nicht.

Da ``/usr/bin/`` Bestandteil der $PATH-Umgebungsvariable ist, reicht es nur den Namen des Programms zum starten anzugeben.

Bei Fehlermeldungen wäre es gut wenn Du die angeben würdest statt nur zu sagen es gab welche. Am besten 1:1 kopieren, mit Traceback.
Marillus
User
Beiträge: 11
Registriert: Montag 22. Dezember 2014, 21:36

Sirius3 hat geschrieben:@Marillus: Programme startet man z.B. mit subprocess.Popen, und wo Dein Programm liegt, mußt Du schon selbst wissen (normalerweise unter /usr/bin/...)
Ich habe nach dem Befehl recherchiert und mal ausprobiert:

Code: Alles auswählen

import subprocess
prog = subprocess.Popen([r"/etc/matchbox", "-h"], stdout=subprocess.PIPE)
Allerdings bekomme ich diese Meldung zurück mit der ich gar nichts weiß anzufangen:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/marillus/PythonProgramme/MariusProjekt/Borries_GUI_communications.py", line 11, in <module>
    prog = subprocess.Popen([r"/etc/matchbox", "-h"], stdout=subprocess.PIPE)
  File "/usr/lib/python3.4/subprocess.py", line 848, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.4/subprocess.py", line 1446, in _execute_child
    raise child_exception_type(errno_num, err_msg)
PermissionError: [Errno 13] Permission denied
Marillus
User
Beiträge: 11
Registriert: Montag 22. Dezember 2014, 21:36

BlackJack hat geschrieben:@Marillus: Zum starten von externen Programmen sollte man das `subprocess`-Modul verwenden. Unter ``/etc/`` liegen aller Regel keine Programme sondern Konfigurationsdaten. Und ich glaube auch nicht das ``/usr/share/matchbox`` das Programm ist, denn unter ``/usr/share/`` liegen in der Regel Daten die von Programmen benötigt werden, wie Grafiken, übersetzte Texte für die Anzeige und so weiter. Das virtuelle Keyboard der `matchbox`-Umgebung heisst `matchbox-keyboard` und die Programmdatei liegt wie die meisten Benutzerprogramme in ``/usr/bin/``. Es gibt eine Manpage die unter ``/usr/share/man/man1/`` liegt, Datendateien für verschiedene Keyboard-Layouts unter ``/usr/share/matchbox-keyboard/``, und ein kleines Keyboard-Icon unter ``/usr/share/pixmaps/``.

Was das 'C:' in dem Pfad bei Dir zu sichen hat ist mir ein Rätsel, denn Laufwerksbuchstaben gibt es unter Linux/Unix nicht.

Da ``/usr/bin/`` Bestandteil der $PATH-Umgebungsvariable ist, reicht es nur den Namen des Programms zum starten anzugeben.

Bei Fehlermeldungen wäre es gut wenn Du die angeben würdest statt nur zu sagen es gab welche. Am besten 1:1 kopieren, mit Traceback.
Das C muss ich beim kopieren des ursprünglichen Beispiels übersehen haben.
Ich habe mal meinen Befehl angepasst, und die Fehlermeldung ist verschwunden:

Code: Alles auswählen

import subprocess
prog = subprocess.Popen([r"matchbox-keyboard", "-h"], stdout=subprocess.PIPE)
Allerdings wird das programm nicht gestartet.
BlackJack

@Marillus: Das Programm wird gestartet, allerdings biegst Du a) die Ausgabe um, das heisst die sieht man dann nicht mehr im Terminal, und b) tust Du danach nichts, also beendet sich Dein Programm und damit auch den Kindprozess.
Marillus
User
Beiträge: 11
Registriert: Montag 22. Dezember 2014, 21:36

BlackJack hat geschrieben:@Marillus: Das Programm wird gestartet, allerdings biegst Du a) die Ausgabe um, das heisst die sieht man dann nicht mehr im Terminal, und b) tust Du danach nichts, also beendet sich Dein Programm und damit auch den Kindprozess.
Super, danke für den Hinweiß, ich habe mich schon über das ein oder andere im Befehl gewundert. Mein Problem ist oft, dass ich einfach die Syntax noch nicht richtig behersche und daher oft auf Anwendungsbeispiele zurückgreifen muss. So tuts mal:

Code: Alles auswählen

prog = subprocess.Popen(["matchbox-keyboard"], stdout=subprocess.PIPE)
Jetzt muss ichs nur noch irgendwie in einer gewissen größe öffnen und auch noch positionieren. Aber das finde ich auch noch raus =)

Danke an alle
Antworten