Ich habe eine Mac-VM, auf der Mavericks (10.9.3) ausgeführt wird, und aus verschiedenen Gründen versuche ich, ein Skript in Python zu schreiben, um automatisch eine PDF-Datei auf die VM zu übertragen und sie in der Vorschau zu öffnen. Für alle, die es nicht wissen, <path-to-Preview> <path-to-file>
öffnet der Befehl die Datei.
Immer wenn das Skript ausgeführt wird, wird die Vorschau geöffnet, aber es wird diese Fehlermeldung ausgegeben:
Dies ist nur eine Beispiel-PDF-Datei, ich habe es auch mit ein paar anderen PDFs versucht. Dieser Fehler tritt nicht auf, wenn ich die Datei per Doppelklick öffne. Nur wenn ich versuche, es zu scripten. Der Fehler tritt auch nicht auf, solange die Datei einmal manuell geöffnet wurde.
Es gibt auch ein paar andere Fehler (Pfade bereinigt).
Fehler im Terminal
2014-08-22 09:33:49.074 Preview[276:2c0b] PVPDFPageContainer initWithURL:file:///path/The-Apple-Sandbox-BHDC2011-Paper.pdf failed, error = Error Domain=NSCocoaErrorDomain Code=257 "The file “The-Apple-Sandbox-BHDC2011-Paper.pdf” couldn’t be opened because you don’t have permission to view it." UserInfo=0x7fe7504ba220 {NSFilePath=/path/The-Apple-Sandbox-BHDC2011-Paper.pdf, NSUnderlyingError=0x7fe7504ba1f0 "The operation couldn’t be completed. Operation not permitted"}
Fehler in der Konsole
9:33:49 AM sandboxd:
([276]) Preview(276) deny file-read-data path/The-Apple-Sandbox-BHDC2011-Paper.pdf
Dinge, die ich ausprobiert habe
Das Ergebnis von ls -l@
im Verzeichnis zeigt die Dateiberechtigungen:
-rwxrwxrwx 1 me wheel 364378 Aug 7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf
Der relevante Teil meines Skripts sieht in etwa so aus:
import subprocess
import os
path = <absolute path to PDF>
os.chmod(path, 0777)
result = subprocess.call(["xattr", "-c", path]) #result is always 0/success
preview = "/Applications/Preview.app/Contents/MacOS/Preview"
subprocess.call([preview, path])
Bearbeiten: Gemäß dem Kommentar eines Glasers subprocess.call(['open','-a','Preview',path])
funktioniert es dort, wo mein Befehl nicht funktioniert.
Ich muss jedoch in der Lage sein, die PID des gestarteten Vorschauprozesses abzurufen (mein Skript wurde dafür vereinfacht, daher war es nicht offensichtlich), und ich sehe keine Möglichkeit, dies insbesondere mit open zu tun wobei möglicherweise mehrere Vorschauprozesse ausgeführt werden. Dazu brauche ich vielleicht eine eigene Frage.
Weitere Informationen für alle anderen mit diesem Problem
Die Hauptursache dieses Problems scheint Apples Anwendungs-Sandbox zu sein. Anscheinend funktioniert der Versuch, es auf diese Weise zu skripten, nicht mit der Sandbox, aber "open" geht durch die richtigen Kanäle, um alle Anforderungen der Sandbox zu erfüllen.
Ich habe dies heute in meiner Freizeit ein wenig getestet, und es scheint, dass dies subprocess.call(['open','-a','Preview',path])
die beste Option zum Öffnen von PDFs in der Vorschau von Python ist.
Ich bin mir immer noch nicht sicher, warum die Verwendung des absoluten Pfads zur Vorschau nicht funktioniert.
Ich versuche, einen Weg zu finden, eine Prozess-PID basierend auf ihrem Fenstertitel in AppleScript zu erhalten. Wenn Sie beispielsweise mit diesem Befehl ein Dokument namens „Test.png“ in der Vorschau öffnen, wird ein Vorschaufenster mit dem Fenstertitel „Test“ angezeigt. Ich hoffe, dass es eine Möglichkeit gibt, die PID dieses Prozesses mithilfe des Fenstertitels abzurufen, aber ich bin mir noch nicht sicher.
Es scheint, dass Vorschau manchmal mit Genehmigungen verwechselt wird. Ein ähnliches Problem wurde durch diese Antwort gelöst , indem einfach die Vorschau beendet wurde.
einglaser
subprocess.call(['open','-a','Preview',path])
? Funktioniert bei mir.Testen
0942v8653
open -nWa Preview $pdf
um zu bewirken, dass der Befehl nicht zurückkehrt, bis der erzeugte Vorschauprozess beendet ist (-n dient zum Erstellen einer neuen Instanz).Testen
Dreviko
Dreviko
Testen