ubuntuusers.de

wmctrl Parameterübergabe in einem Pythonskipt

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

HansF

Anmeldungsdatum:
14. September 2010

Beiträge: 101

Ich möchte ein Fenster (z.B. "eog datei.jpg") variabel auf meinem Monitor platzieren. Dies funktioniert mit "wmctrl -a datei.jpg" und dem "-e g,x,y,w,h" Parameter/Argument.

Was funktioniert bei mir?

Im Terminal kann ich eine Variable x setzen und dann mit "wmctrl -a datei.jpg -e 0,$x,0,600,800" das Programmfenster für eog variabel platzieren.

Ich versuche das gleiche Kommando (copy, paste, also kein Tippfehler) in python3 über os.system(cmd), bekomme aber die Meldung

The -e option expects a list of comma separated integers: "gravity,X,Y,width,height" mit Fehlercode 256.

Das passiert aus einem python3-Programm genauso, wie wenn ich das über Terminal –> python3 als interaktiven Konsolen-Code versuche.

Eigentlich kann man da nichts falsch machen (os.system(cmd) funktioniert bei allen anderen Kommandos, die ich bisher verwendet habe in ubuntu und python3 os.system(cmd) identisch.

Wer hat eine Idee, was ich da falsch machen kann?

Bearbeitet von sebix:

Bitte wähle in Zukunft einen aussagekräftigen Titel!

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Und wie sieht der Code aus?

HansF

(Themenstarter)

Anmeldungsdatum:
14. September 2010

Beiträge: 101

Der Code ist für eog "eog Ade.jpg" (Ade.jpg ist meine Datei)

Was funktioniert in der python3-Konsole ist:

1
2
3
4
>>> cmd="wmctrl -a Ade-jpg -e 0,10,0,600,800"

>>> os.system(cmd)
0

0 ist der Returncode für funktioniert

Was funktioniert nicht?

1
2
3
4
5
6
7
8
>>> x=50

>>> cmd="wmctrl -a Ade.jpg -e 0,$x,0,600,800"

>>> os.system(cmd)

The -e option expects a list of comma separated integers: "gravity,X,Y,width,height"
256

256 ist der Code für "funktioniert nicht" und davor die Fehlermeldung

Und im Ubuntu-Terminal funktioniert das folgende problemlos

1
2
3
4

$ x=500

$ wmctrl -a Ade.jpg -e 0,$x,0,600,800

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Wenn du Variablen in einem Python-String ersetzen/einsetzen willst, musst du halt den Python-Weg nehmen statt eine Shell-Variablenersetzung zu nutzen - da gibt es mehrere Möglichkeiten:

1
2
3
4
5
6
7
import os
x = 50
cmd = "wmctrl -a Ade.jpg -e 0,%d,0,600,800" % x  # alte Methode, hauptsächlich für frühe Python 2 Versionen
cmd = "wmctrl -a Ade.jpg -e 0,{},0,600,800".format(x)  # neuere Methode, ab Python 2.6
cmd = f"wmctrl -a Ade.jpg -e 0,{x},0,600,800"  # Ab Python 3.6

os.system(cmd)

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Weiters noch der obligatorische Hinweis, dass subprocess.run ein deutlich besseres Interface ist

HansF

(Themenstarter)

Anmeldungsdatum:
14. September 2010

Beiträge: 101

Vielen Dank, bin noch ziemlich neu in Python unterwegs, ich kannte das wirklich nicht (und fand es auf keinem Forum erklärt)

HansF

(Themenstarter)

Anmeldungsdatum:
14. September 2010

Beiträge: 101

Sorry, trotz gelöst noch ein Nachtrag! mit subprocess.run bekomme ich die Parameter noch nicht gebacken!

selbst ohne variables funktioniert mir

1
2
3
>>> cmd="wmctrl -a Ade-jpg -e 0,10,0,600,800"

>>> os.system(cmd)

mit subprocess.run(cmd) NICHT. Der Returncode ist 1

??

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Dokumentation gelesen? subprocess.run nimmt als Argument eine Liste.

Variante fuer Faule:

1
subprocess.run("wmctrl -a Ade-jpg -e 0,10,0,600,800".split(" "))

Ansonsten bitte immer ein Beispiel angeben, das (nicht) funktioniert. Hellsehen koennen wir leider nicht.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

HansF schrieb:

Vielen Dank, bin noch ziemlich neu in Python unterwegs, ich kannte das wirklich nicht (und fand es auf keinem Forum erklärt)

Die Dokumentation für Python ist gut und es lohnt sich sie zu lesen ☺

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

sebix schrieb:

Variante fuer Faule:

1
subprocess.run("wmctrl -a Ade-jpg -e 0,10,0,600,800".split(" "))

Variante für noch faulere, die keine Liste erzeugen wollen (weil man da schnell bei shlex.split() landet, wenn die Argumente etwas komplexer sind):

1
subprocess.run("wmctrl -a Ade-jpg -e 0,10,0,600,800", shell=True)
Antworten |