OS.System Kommando liefert syntax 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
Jack_Rasp
User
Beiträge: 8
Registriert: Donnerstag 7. Mai 2020, 09:36

Hallo zusammen,

ich versuche, einen Video-Stream einer USB Webcam aus einem Pythonskript heraus zu starten.

Code: Alles auswählen

import os               
	os.system('vlc --fullscreen v4l2:///dev/video0')
Das funktioniert erstmal soweit.
Da ich bei der Kamera das Bild spiegeln muss habe ich die VLC Kommandozeile entsprechend ergänzt:

Code: Alles auswählen

import os
	os.system("vlc --video-filter='transform{type="vflip"}' --fullscreen v4l2:///dev/video0")
Jetzt kommt für die Zeile ein Syntax Fehler. Ich vermute, dass das mit den " und ' nicht klappt...
Muss ich da was beachten?

Schon mal Danke, wenn einer helfen kann!!

Gruß
Jack
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher soll Python wissen, wann ein String aufhört, wenn in dem String " vorkommt?

os.system ist veraltet. Benutze subprocess.run:

Code: Alles auswählen

import subprocess

subprocess.run(["vlc", """--video-filter='transform{type="vflip"}'""", "--fullscreen", "v4l2:///dev/video0"])
Benutzeravatar
__blackjack__
User
Beiträge: 14003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jack_Rasp: Wenn Du eine Zeichenkette mit " anfängst, dann ist das nächste vorkommen von einem " das Ende der Zeichenkette. Der Compiler kann da ja nun nicht irgendwie raten das es das in diesem Fall nicht sein so sein sollte. Aber grundsätzlich ist `os.system()` schon keine gute Idee. Um externe Programme zu starten gibt es das `subprocess`-Modul. Das sähe dann so aus (ungetestet):

Code: Alles auswählen

...
    subprocess.run(
        [
            "vlc",
            '--video-filter=transform{type="vflip"}',
            "--fullscreen",
            "v4l2:///dev/video0",
        ],
        check=True,
    )
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Jack_Rasp
User
Beiträge: 8
Registriert: Donnerstag 7. Mai 2020, 09:36

Vielen dank schon mal für Eure Antworten!

Ich hatte schon vermutet, dass das mit den " in der " " -Zeichenfolge zu tun hatte.

Wenn ich Eure Trennung mit Kommas in den os.system Befehl übernehme, meckert er, dass 4 statt einem Argument angegeben sind.

Wenn ich Euren Ansatz mit dem Subprozess verfolge, klappt es leider an einer anderen Stelle nicht. Folgende Fehlermeldung kommt:

Code: Alles auswählen

    
subprocess.run(["vlc", """--video-filter='transform{type="vflip"}'""", "--fullscreen", "v4l2:///dev/video0"])
AttributeError: 'module' object has no attribute 'run'
Wie komme ich da jetzt weiter??

Danke!!

Gruß
Jack
Benutzeravatar
__blackjack__
User
Beiträge: 14003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jack_Rasp: Installiere eine neuere Python-Version‽ Die `run()`-Funktion gibt es seit Python 3.5 und das ist mittlerweile schon ziemlich alt. 5 Jahre und der Support dafür endet noch dieses Jahr.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Jack_Rasp
User
Beiträge: 8
Registriert: Donnerstag 7. Mai 2020, 09:36

Hallo tatsächlich läuft mein Programm unter Python 2.7.16.

Dort gibt es den run Befehl offensichtlich nicht.

Wenn ich das Programm unter python 3.7 laufen lasse, funktioniert die von Euch vorgeschlagene Lösung mit subprocess, ABER leider kann ich ADAFRUIT nicht mehr benutzen.
Das scheint wiederum in Python3 nicht erkannt zu werden.

Also nächstes Problem:

Weiß jemand, ob es ADAFRUIT (ich steuere damit ws2801 LED Streifen an) für Python 3 gibt und wie ich ihm das dann beibringe?

Gibt es vielleicht doch eine Möglichkeit die Problematik mit den " innerhalb der äußeren " " an os.system zu übergeben?

Meine Krücke jetzt: Ich habe ein zweites Skript mit dem subprocess für den VLC-Player, das ich mit python3 aufrufe. Wiederum über os.system aus meinem eigentlichen Programm.

Code: Alles auswählen

import os
os.sytem (python3 rearcam.py)
in rearcam befindet sich wie gesagt Eure Lösung mit dem Subprocess.

Ja ich weiß... nicht elegant... maximal kreativ...

Vielen Dank schon mal!


Gruß
Jack
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Python2 ist schon seit langem durch Python3 ersetzt worden. Jetzt noch Programme damit zu schreiben, ist halt schwierig. Und natürlich gibt es die ws2801-Anbindung auch für Python3: https://pypi.org/project/adafruit-circuitpython-ws2801/
Benutzeravatar
kbr
User
Beiträge: 1504
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Jack_Rasp: Python 2.7 bietet immerhin schon subprocess.call(), was in Deinem Fall ausreichen könnte. Wenn Du aber bei Python 2 bleibst, wirst Du immer wieder (und öfter) auf solche Schwierigkeiten stoßen.
Jack_Rasp
User
Beiträge: 8
Registriert: Donnerstag 7. Mai 2020, 09:36

Hallo,

stimmt subprocess.call geht in der 2.7er und funktioniert soweit.

Ich denke ich werde das mal auf Python3 umbauen, ist ja eigentlich nur ADAFRUIT, was ich neu installieren muss.

Nichtsdestotrotz: Für alle, die ein ähnliches Problem haben wie ich:

import os

Code: Alles auswählen

os.system ("vlc --video-filter=transform{type='vflip'} --fullscreen v4l2:///dev/video0")
Ich habe die " bei vflip durch ' ersetzt. Damit wird Anfang und Ende sauber erkannt.
So geht es dann auch mit os.system.

Die Kommandozeile streamt übrigens eine USB-Kamera über VLC im Vollbildmodus und spiegelt dabei das Bild. Stichwort Rückfahrkamera im Auto.

Danke für Eure Hilfe!

Gruß
Jack
Antworten