Tengo una Mac VM corriendo Mavericks (10.9.3), y por diversas razones estoy tratando de escribir un script en Python para transferir automáticamente un archivo PDF a la VM y abrirlo en Vista Previa. Para quien no lo sepa, el comando <path-to-Preview> <path-to-file>
abrirá el archivo.
Siempre que se ejecute el script, se abrirá Vista Previa, pero dará este mensaje de error:
Este es sólo un archivo PDF de muestra, lo he probado con un par de otros PDFs también. Este error no se produce cuando abro el archivo haciendo doble clic en él. Sólo cuando intento script. El error tampoco se produce mientras el archivo se haya abierto manualmente una vez.
También hay un par de errores más (rutas saneadas).
Error en el 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"}
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
- Reparación de los permisos de disco mediante la utilidad de discos y reinicio de la máquina virtual
- Cambiar los permisos del archivo a 777 antes de abrirlo
- Eliminar cualquier atributo extra de los archivos (como la cuarentena) con xattr antes de abrirlos
El resultado de ls -l@
en el directorio muestra los permisos de los archivos son:
-rwxrwxrwx 1 me wheel 364378 Aug 7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf
La parte relevante de mi script es algo así:
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 ser capaz de obtener el pid del proceso de Vista Previa que se inicia (mi script ha sido simplificado para esto, así que no era obvio) y no veo ninguna manera de hacer eso con open, especialmente con múltiples procesos de Vista Previa potencialmente en ejecución. Puede que necesite una pregunta separada para eso.
Más información para quien tenga este problema
La causa principal de este problema parece ser el sandbox de aplicaciones de Apple. Al parecer, el intento de script de esta manera no funciona con la caja de arena, pero "abrir" va a través de los canales adecuados para satisfacer cualquier requisito que la caja de arena tiene.
0 votos
¿Qué pasa con
subprocess.call(['open','-a','Preview',path])
?0 votos
H
0 votos
Desafortunadamente necesito el pid para más que eso - envío a Preview un par de comandos, no estoy realmente interesado en cuando sale. He estado googleando mucho sobre abrir y obtener pids, pero todo lo que obtengo es que realmente no es posible. Así que "open" no funcionará en mi caso concreto. Si quieres publicar tu comando como respuesta, @aglasser, lo aceptaré, ya que responde a la pregunta original aunque no pueda usarlo.
0 votos
Fwiw estoy teniendo un problema similar, pero no de Python: Tengo un montón de archivos jpg creados por matplotlib y rsync'd de un servidor ubuntu a mi mac. La mayoría de ellos se pueden abrir en Vista Previa bien, pero hay un subconjunto que no puede, con el error de arriba. Los permisos son todos idénticos, así que Vista Previa está mintiendo sobre los permisos...
0 votos
Resuelto saliendo de la vista previa según apple.stackexchange.com/a/223165/42929
0 votos
@drevicko Lamentablemente eso no me funciona, aunque esta pregunta es bastante antigua a estas alturas. Vista Previa no estaba abierta para empezar (sólo la inicio cuando quiero abrir un archivo, y el archivo no se ha abierto previamente), e iniciarla y detenerla sin abrir un archivo no cambia nada. Aunque es posible que haya alguna diferencia en versiones más nuevas de Vista Previa.