Ho una Mac VM con Mavericks (10.9.3), e per vari motivi sto cercando di scrivere uno script in Python per trasferire automaticamente un file PDF alla VM e aprirlo in Anteprima. Per chi non lo sapesse, il comando <path-to-Preview> <path-to-file>
aprirà il file.
Ogni volta che lo script viene eseguito, Anteprima si aprirà, ma darà questo messaggio di errore:
QuestoèsolounfilePDFdiesempio,l'hoprovatoancheconunpaiodialtriPDF.Questoerrorenonsiverificaquandoaproilfilefacendodoppioclicsudiesso.Soloquandoprovoascriverlo.Anchel'errorenonsiverificafinchéilfileèstatoapertomanualmenteunavolta.
Cisonoancheunpaiodialtrierrori(percorsidisinfettati).
Errorenelterminale
2014-08-2209:33:49.074Preview[276:2c0b]PVPDFPageContainerinitWithURL:file:///path/The-Apple-Sandbox-BHDC2011-Paper.pdffailed,error=ErrorDomain=NSCocoaErrorDomainCode=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"}
Errore nella console
9:33:49 AM sandboxd:
([276]) Preview(276) deny file-read-data path/The-Apple-Sandbox-BHDC2011-Paper.pdf
Cose che ho provato
- Ripristino delle autorizzazioni del disco utilizzando l'utilità del disco e riavvio della VM
- Modifica delle autorizzazioni del file su 777 prima di aprire
- Rimozione di eventuali attributi di file aggiuntivi (come la quarantena) con xattr prima di aprire
Il risultato di ls -l@
nella directory mostra i permessi del file:
-rwxrwxrwx 1 me wheel 364378 Aug 7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf
La parte rilevante del mio script assomiglia a questo:
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])
Modifica: come per il commento dell'aglasser, subprocess.call(['open','-a','Preview',path])
funziona dove il mio comando non lo farà.
Tuttavia, devo essere in grado di ottenere il pid del processo di anteprima che è stato avviato (il mio script è stato semplificato per questo, quindi non era ovvio) e non vedo alcun modo per farlo con aperto, specialmente con più processi di anteprima potenzialmente in esecuzione. Potrei aver bisogno di una domanda separata per questo.
Ulteriori informazioni per chiunque altro con questo problema
La causa principale di questo problema sembra essere la sandbox delle applicazioni di Apple. Apparentemente il tentativo di copiarlo in questo modo non funziona con la sandbox, ma "open" passa attraverso i canali appropriati per soddisfare qualsiasi richiesta della sandbox.