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.
subprocess.call(['open','-a','Preview',path])
? Funktioniert bei mir.open -nWa Preview $pdf
den Befehl so einstellen , dass er erst nach Beendigung des Vorschauprozesses zurückkehrt (-n dient zum Erstellen einer neuen Instanz).Antworten:
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 es nicht funktioniert, den absoluten Pfad zur Vorschau zu verwenden.
Ich versuche einen Weg zu finden, um eine Prozess-PID basierend auf dem Fenstertitel in AppleScript zu erhalten. Wenn Sie beispielsweise mit diesem Befehl ein Dokument mit dem Namen "Test.png" in der Vorschau öffnen, wird ein Vorschaufenster mit dem Fenstertitel "Test" erstellt. Ich hoffe, dass es eine Möglichkeit gibt, die PID dieses Prozesses mithilfe des Fenstertitels zu ermitteln, bin mir aber noch nicht sicher.
quelle
Es scheint, dass Preview manchmal mit Pemissionen verwechselt wird. Ein ähnliches Problem wurde durch diese Antwort gelöst, indem die Vorschau einfach beendet wurde.
quelle