staging.inyokaproject.org

python: Zugangshilfen aufrufen

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

marlem

Avatar von marlem

Anmeldungsdatum:
12. Juli 2016

Beiträge: 139

Hallo,

folgender Aufruf in der Konsole funktioniert:

1
gnome-control-center universal-access

Folgender Python-Code:

1
process = subprocess.Popen(['gnome-control-center universal-access'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

wirft diese Fehlermeldung:

1
2
3
4
5
6
7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'gnome-control-center universal-access'

Frage: Was muß ich ändern?

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

marlem schrieb:

Hallo,

folgender Aufruf in der Konsole funktioniert:

1
gnome-control-center universal-access

Folgender Python-Code:

1
process = subprocess.Popen(['gnome-control-center universal-access'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

wirft diese Fehlermeldung:

1
2
3
4
5
6
7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'gnome-control-center universal-access'

Frage: Was muß ich ändern?

So:

1
process = subprocess.Popen(['gnome-control-center', 'universal-access'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

Pro Argument ein Listenelement.

marlem

(Themenstarter)
Avatar von marlem

Anmeldungsdatum:
12. Juli 2016

Beiträge: 139

Danke! Funktioniert. Ich schreibe es mir auf. Vielen Dank!

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

marlem schrieb:

Ich schreibe es mir auf.

Kannst du natürlich, aber das ist auch genau so in der Python-Doku des subprocess Moduls erklärt. Oder anders gesagt: das hat schon mal wer allgemein zugänglich aufgeschrieben.

Gruß, noisefloor

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Der Code ist dann aber noch nicht vollständiger Ersatz für den Aufruf im Terminal. A) muss man wenn man die Ausgabe(n) umleitet, diese auch auslesen. Sonst kann der Prozess hängen bleiben wenn der/die entsprechende(n) Puffer voll sind. Und B) muss man auch auf das Ende des Prozesses warten. Sonst hat man für die Laufzeit des Python-Prozesses einen Zombie-Prozess im System hängen, oder der Python-Prozess endet bevor das externe Programm vollständig gelaufen ist, und bricht das mit seinem Ende auch ab.

Wenn man beide Ausgaben umleitet muss man die zudem so auslesen das die nebenläufig verarbeitet werden. Sonst kann das ganze auch hängen. Wenn man die Daten gar nicht innerhalb des Programms braucht, sollte man sie gar nicht erst umleiten. Wenn man sie gesammelt weiterverarbeiten kann, also nicht während des Auslesens schon verarbeiten muss, kann man auch einfach subprocess.run() verwenden, und die gesamten Ausgaben dann von dem Objekt abfragen was als Rückgabewert geliefert wird.

Nur die Terminalzeile wäre:

1
subprocess.run(["gnome-control-center", "universal-access"], check=True)
Antworten |