shutil.copyfile geht nicht mit asterisk

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Hi,
ich habe für asterisk ein Call-File erstellt. Das funktioniert auch, wenn ich über das Terminal folgenden befehl als root eingebe, klingeln die Telefone:

Code: Alles auswählen

mv /home/pi/klingel_all.call /var/spool/asterisk/outgoing/
In meinem Python Skript heißt es:

Code: Alles auswählen

callfilepfad = "/home/pi/klingel_all.call" 
...
shutil.copyfile(callfilepfad,'/var/spool/asterisk/outgoing/anruf.call')
(eine anruf.call hab ich aber nicht)

Es funktioniert auch nicht, wenn ich folgendes schreibe

Code: Alles auswählen

shutil.copyfile(callfilepfad,'/var/spool/asterisk/outgoing/')
In beiden Fällen bleibt der Code dann dort stehen. Kann ich irgendeinen Rückgabewert abfragen, um herauszufinden, woran es liegt?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@sunshineh: Was heißt "der Code bleibt dort stehen"?
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Ich meine, ich habe nach dieser Zeile eine Printmeldung eingefügt, diese wird aber nicht mehr ausgegeben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Um was für eine Datei handelt es sich bei `/home/pi/klingel_all.call`?

Das äquivalent zum Shell-Befehl wäre:

Code: Alles auswählen

os.rename(callfilepfad, '/var/spool/asterisk/outgoing/anruf.call')
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Was soll da passieren? Es ändert sich nichts.
Wird da auch das File in den Pfad kopiert?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@sunshineh: Sirius3 hat das Python-Pendant zu Deinem Eingangs verwendeten 'mv' Befehl auf der Shell verwendet. Daher sollte auch das gleiche geschehen. Wenn Du hinter diese Anweisung ein 'print()' einfügst, wird dieses entweder ausgeführt, oder die vorhergehende Anweisung (os.rename) wirft eine Ausnahme. Dann siehst Du den entsprechenden Traceback. Also, irgendwas wird bei Dir schon geschehen.
sunshineh
User
Beiträge: 22
Registriert: Dienstag 3. Januar 2017, 11:21

Bei mir kam keine Rückmeldung, keine Ausnahme/Fehlermeldung. Ich bin einfach nicht zur nächsten print-Ausgabe gekommen.

Wenn ich das Skript mit sudo ausführe, geht es!! Ich könnte mich so ärgern, dass ich das nicht gleich versucht habe... :x
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn es irgendwelche Probleme mit Berechtigungen bei Dateioperationen gibt, dann reicht Python einem das als Fehlermeldung durch. Dass es dazu schweigt, ist ziemlich unwahrscheinlich, weil so doof sind die Python-Programmierer eigentlich nicht. Falls du dir sicher bist, dass es keine andere Ursache gibt, dann solltest du dies als Problembericht (Issue) einreichen. Denn sowas sollte nicht vorkommen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@sunshineh: das kann nicht sein. Wenn man versucht, eine Datei in ein Verzeichnis zu verschieben, auf das man keine Berechtigung hat, kommt eine Fehlermeldugn:

Code: Alles auswählen

>>> os.rename('test.txt','/root/test.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied
ebenso bei shutil:

Code: Alles auswählen

>>> shutil.copyfile('test.txt','/root/')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/root/test.txt'
Antworten