Vorschau öffnet Datei nicht - Berechtigungsproblem (über Python)

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:Fehlermeldung

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

  • Reparieren der Festplattenberechtigungen mit dem Festplattendienstprogramm und Neustarten der VM
  • Ändern Sie die Berechtigungen der Datei vor dem Öffnen auf 777
  • Entfernen aller zusätzlichen Dateiattribute (wie Quarantäne) mit xattr vor dem Öffnen

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.

Was ist mit subprocess.call(['open','-a','Preview',path])? Funktioniert bei mir.
Hm, ja, das geht. Ich frage mich, was das anders macht. Ich muss jedoch die PID der verschiedenen Vorschauprozesse verfolgen, und ich sehe keine Möglichkeit, dies mit open zu tun. Vielleicht brauche ich dazu noch eine Frage...
@Testing: Wenn der Grund, warum Sie die PID benötigen, darin besteht, zu wissen, wann die Vorschau beendet wurde, können Sie verwenden, open -nWa Preview $pdfum zu bewirken, dass der Befehl nicht zurückkehrt, bis der erzeugte Vorschauprozess beendet ist (-n dient zum Erstellen einer neuen Instanz).
Leider brauche ich die PID für mehr als das - ich sende Preview ein paar Befehle, es interessiert mich nicht wirklich, wann es beendet wird. Ich habe viel nach Open gegoogelt und Pids erhalten, aber alles, was ich bekomme, ist, dass es wirklich nicht möglich ist. "Öffnen" funktioniert also in meinem speziellen Fall nicht. Wenn Sie Ihren Befehl jedoch als Antwort posten möchten, @aglasser, akzeptiere ich ihn, da er die ursprüngliche Frage beantwortet, auch wenn ich ihn nicht verwenden kann.
fwiw Ich habe ein ähnliches Problem, aber nicht von Python: Ich habe eine Reihe von JPG-Dateien, die von Matplotlib erstellt und von einem Ubuntu-Server auf meinen Mac synchronisiert wurden. Die meisten von ihnen können in der Vorschau geöffnet werden, aber es gibt eine Untergruppe, die dies nicht kann, mit dem obigen Fehler. Berechtigungen sind alle identisch, also lügt die Vorschau über Berechtigungen ...
Gelöst durch Beenden der Vorschau gemäß apple.stackexchange.com/a/223165/42929
@drevicko Leider funktioniert das bei mir nicht, auch wenn diese Frage an dieser Stelle schon recht alt ist. Die Vorschau war zu Beginn nicht geöffnet (ich starte sie nur, wenn ich eine Datei öffnen möchte und die Datei zuvor nicht geöffnet wurde), und das Starten und Stoppen ohne Öffnen einer Datei ändert nichts. Obwohl es möglich ist, gibt es einige Unterschiede in neueren Vorschauversionen.

Antworten (2)

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.

Danke, lassen Sie mich wissen, wenn Sie etwas Vielversprechendes zum PID-via-Fenstertitel-Ansatz finden.

Es scheint, dass Vorschau manchmal mit Genehmigungen verwechselt wird. Ein ähnliches Problem wurde durch diese Antwort gelöst , indem einfach die Vorschau beendet wurde.