Ich habe eine Mac-VM mit Mavericks (10.9.3) und aus verschiedenen Gründen versuche ich, ein Skript in Python zu schreiben, um automatisch eine PDF-Datei auf die VM zu übertragen und 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, es wird jedoch die folgende Fehlermeldung angezeigt:
Dies ist nur eine Beispiel-PDF-Datei. Ich habe sie auch mit einigen anderen PDF-Dateien ausprobiert. Dieser Fehler tritt nicht auf, wenn ich die Datei durch Doppelklicken öffne. Nur wenn ich versuche es zu skripten. Der Fehler tritt auch nicht auf, solange die Datei einmal manuell geöffnet wurde.
Es gibt noch einige andere Fehler (bereinigte Pfade).
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 versucht habe
- Reparieren der Festplattenberechtigungen mit dem Festplatten-Dienstprogramm und Neustarten der VM
- Ändern Sie die Berechtigungen der Datei auf 777, bevor Sie sie öffnen
- Entfernen Sie vor dem Öffnen alle zusätzlichen Dateiattribute (z. B. Quarantäne) mit xattr
Das Ergebnis ls -l@
im Verzeichnis zeigt die Dateiberechtigungen sind:
-rwxrwxrwx 1 me wheel 364378 Aug 7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf
Der relevante Teil meines Skripts sieht ungefähr 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: Funktioniert laut Aglasserkommentar dort, subprocess.call(['open','-a','Preview',path])
wo mein Befehl es nicht tut.
Ich muss jedoch in der Lage sein, die PID des Vorschauprozesses zu erhalten, der gestartet wird (mein Skript wurde dafür vereinfacht, daher war es nicht offensichtlich), und ich sehe keine Möglichkeit, dies insbesondere mit open zu tun mit mehreren Vorschau-Prozess möglicherweise ausgeführt. Ich brauche dafür möglicherweise eine separate Frage.
Weitere Informationen für alle anderen Benutzer mit diesem Problem
Die Hauptursache für dieses Problem scheint Apples Anwendungs-Sandbox zu sein. Anscheinend funktioniert der Versuch, das Skript auf diese Weise zu schreiben, nicht mit der Sandbox, aber "open" geht durch die richtigen Kanäle, um alle Anforderungen der Sandbox zu erfüllen.
open -nWa Preview $pdf
den Befehl so einstellen , dass er erst nach Beendigung des Vorschauprozesses zurückkehrt (-n dient zum Erstellen einer neuen Instanz).
subprocess.call(['open','-a','Preview',path])
? Funktioniert bei mir.