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

3

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

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.

Testen
quelle
Was ist subprocess.call(['open','-a','Preview',path])? Funktioniert bei mir.
Aglasser
Hmm, ja, das funktioniert. Ich frage mich, was das anders macht. Ich muss jedoch die PID der verschiedenen Vorschauprozesse nachverfolgen, und ich sehe keine Möglichkeit, dies mit open zu tun. Vielleicht brauche ich dafür eine andere Frage ...
Testen
@Testing: Wenn Sie wissen möchten, wann Preview beendet wurde, können Sie open -nWa Preview $pdfden Befehl so einstellen , dass er erst nach Beendigung des Vorschauprozesses zurückkehrt (-n dient zum Erstellen einer neuen Instanz).
0942v8653
Leider brauche ich die pid für mehr als das - ich sende Preview ein paar Befehle, ich bin nicht wirklich daran interessiert, wann es endet. Ich habe viel auf Open gegoogelt und Pids bekommen, aber alles, was ich bekomme, ist, dass es wirklich nicht möglich ist. Also "open" wird in meinem speziellen Fall nicht funktionieren. Wenn Sie Ihren Befehl jedoch als Antwort posten möchten, @aglasser, werde ich ihn annehmen, da er die ursprüngliche Frage beantwortet, auch wenn ich ihn nicht verwenden kann.
Testen
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 Preview über Berechtigungen ...
drevicko

Antworten:

0

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.

Aglasser
quelle
Vielen Dank, lassen Sie es mich wissen, wenn Sie etwas Vielversprechendes zum PID-via-Window-Title-Ansatz finden.
Testen
0

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

drevicko
quelle