os.system

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich möchte mit den vlc player einen Stream speichern.
Mit den Nachfolgenden Befehl klappt das in der shell und auch als bash script, aber bei Python zeigt mir bei den Pfad 'invalid syntax' an.
Was kann ich hier verändern?

"os.system('sudo cvlc -vvv http://192.168.178.131:8080/?action=stream --sout file/ts:stream.mpg')"
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Mal abgesehen davon das man hier auch Tags kennt, was für ein Programm soll denn clvc sein?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

cvlc ist doch der Terminal befehl für vlc.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Vergiss das es Os.system gibt. Benutz subprocess.call und eine explizite Liste von Argumenten. Und bitte poste den kompletten Fehler. Irgendein SynaxError ist zu unspezifisch.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich hab es jetzt mal mit den Befehl 'subprocess' probiert, aber der gleiche Fehler.
Hier meine Command line im Script:

Code: Alles auswählen

Poppen ('sudo cvlc -vvv http://192.168.178.131:8080/?action=stream --sout file/test:s.mpg', shell=true)
Hier die Fehlermeldung von der shell beim Aufruf des scriptes:
pi@raspberrypi:~$ sudo python /home/pi/3.py File "/home/pi/3.py", line 6
File "/home/pi/3.py", line 6
Poppen ('sudo cvlc -vvv http://192.168.178.131:8080/?action=stream --sout file/test:s.mpg', shell=true)
^
SyntaxError: invalid syntax
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@egon11: SyntaxError heißt, dass Du Dich nicht an die Grammatik von Python hältst, meist eine Klammer, ein Komma oder ähnliches vergessen hast. Dass das in der gezeigten Stelle entdeckt wird, heißt nicht, dass dort auch der Fehler liegt, sondern er liegt höchst wahrscheinlich in der Zeile davor. Daneben ist Poppen wahrscheinlich unbekannt, ebenso true; beim Programmieren muß man sich penibel an die korrekte Schreibweise halten. Als nächstes hat dir __deets__ empfohlen, das Kommando als Liste ohne `shell=True` zu übergeben. Das hat nicht nur den Vorteil, dass es sicherer ist, weil es keine Sonderzeichen gibt, die von der Shell falsch interpretiert werden könnten, sondern auch, dass Variablen, wie die URL, einfacher übergeben werden können.
BlackJack

@egon11: Wofür braucht ``cvlc`` eigentlich Root-Rechte? Das sollte nicht nötig sein!

Dateinamen für Python-Quelltexte sollte man so wählen, dass der Name vor dem ``.py`` ein gültiger Bezeichner in Python wäre, denn das ist ja der Modulname. `3` ist kein gültiger Bezeichner, also kann man das Modul beispielsweise nicht importieren. Aus anderen Modulen, zum Beispiel zum automatisierten Testen, oder um in einer interaktiven Python-Shell einzelne Funktionen aus dem Modul auszuprobieren.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ok danke, es hat letztendlich bei den Verzeichnis "nur" die ' gefehlt.
So sieht jetzt mein kleines Script aus:

Code: Alles auswählen

import time
import os
import subprocess

t = time.strftime('%H:%M:%S_%d.%m.%Y')
os.system("cvlc -vvv http://localhost:8080/?action=stream --sout file/ts:'/home/pi/hallo/%s.mpg'" %t)
Hat jemand eine Idee wie es nach 2h automatisch wieder beendet wird?
Hab schon mit 'time.sleep' und anschließend mit 'sys.exit' versucht, aber erfolglos leider.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir wurde bereits geraten, das subprocess-Modul zu benutzen. Das ignorierst du fleissig, aber damit wuerde es gehen.

https://docs.python.org/2/library/subpr ... .terminate
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@egon11: cvlc könnte Probleme mit Deinen Doppelpunkten im Dateinamen haben. So bennent man Dateien auch nicht. Übliche Datumsschreibweise ist "YYYYmmdd_HHMMSS.mpg", dann kann man die Dateien auch ganz einfach nach Datum sortieren. Du importierst subprocess, benutzt es aber trotzdem nicht :roll: .
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hier mein Script:

Code: Alles auswählen

import time
import os
import subprocess

subprocess.call("cvlc -vvv http://localhost:8080/?action=stream --sout file/ts:'/home/pi/video.mpg'")

Irgendetwas macht da fehler:

Code: Alles auswählen

    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Zuletzt geändert von Anonymous am Donnerstag 17. August 2017, 20:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

@ BlackJack
Könntest mir sagen ob das an meiner command line liegt, oder am Befehl?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@egon11: die Argumente müssen als Liste übergeben werden.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Heißt das den kompletten Befehl in []?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Könnte mir jemand vielleicht mal auf die Sprünge helfen wie da die Syntax aussehen muss?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

p = subprocess.Popen(["kommando", "--option", "--option-mit-argument=foo"])
...
p.kill()
Beispiele finden sich hier im Forum aber auch zu Hunderten. Ein bisschen Eigeninitiative führt auch zum ziel.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich bräuchte nur mal einen Denkanstoß, kann ich mein komando ("cvlc -vvv http://localhost:8080/?action=stream --sout file/ts:'/home/pi/video.mpg'") so lassen in der Liste, oder muss ich den auch einzeln aufsplitten?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

egon11 hat geschrieben:kann ich mein komando ("cvlc -vvv http://localhost:8080/?action=stream --sout file/ts:'/home/pi/video.mpg'") so lassen in der Liste, oder muss ich den auch einzeln aufsplitten?
Versuch mal länger als 2 Sekunden auf die Beispiele zu gucken. Vielleicht erkennst du dann ein Muster darin, das deine Frage beantworten könnte...
Antworten