Tengo una máquina virtual Mac que ejecuta Mavericks (10.9.3) y, por diversos motivos, estoy intentando escribir un script en Python para transferir automáticamente un archivo PDF a la VM y abrirlo en Vista previa. Para cualquier persona que no sepa, el comando <path-to-Preview> <path-to-file>
abrirá el archivo.
Siempre que se ejecute el script, se abrirá la Vista previa, pero mostrará este mensaje de error:
EstoessolounarchivoPDFdemuestra,tambiénloheprobadoconunpardeotrosPDF.Esteerrornoseproducecuandoabroelarchivohaciendodobleclicenél.Solocuandointentoescribirlo.Elerrortampocoocurresiemprequeelarchivosehayaabiertomanualmenteunavez.
Tambiénhayunpardeotroserrores(rutasdesinfectadas).
ErrorenlaTerminal
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"}
Error en la consola
9:33:49 AM sandboxd:
([276]) Preview(276) deny file-read-data path/The-Apple-Sandbox-BHDC2011-Paper.pdf
Cosas que he probado
- Reparando los permisos de disco usando la utilidad de disco y reiniciando la máquina virtual
- Cambiar los permisos del archivo a 777 antes de abrir
- Eliminando cualquier atributo de archivo adicional (como la cuarentena) con xattr antes de abrir
El resultado de ls -l@
en el directorio muestra que los permisos de archivo son:
-rwxrwxrwx 1 me wheel 364378 Aug 7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf
La parte relevante de mi script se parece a esto:
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])
Editar: Según el comentario de aglasser, subprocess.call(['open','-a','Preview',path])
funciona donde mi comando no lo hace.
Sin embargo, necesito poder obtener el pid del proceso de vista previa que se inició (mi script se ha simplificado para esto, así que no fue obvio) y no veo ninguna manera de hacerlo con abierto, especialmente con el proceso de vista previa múltiple potencialmente en ejecución. Puede que necesite una pregunta por separado para eso.
Más información para cualquier otra persona con este problema
La causa raíz de este problema parece ser el sandbox de la aplicación de Apple. Al parecer, intentar ejecutarlo de esta manera no funciona con el sandbox, pero "abrir" pasa por los canales adecuados para satisfacer los requisitos que tiene el sandbox.