La vista previa no abre el archivo: problema de permisos (a través de Python)

Tengo una máquina virtual Mac que ejecuta Mavericks (10.9.3) y, por varios motivos, intento escribir un script en Python para transferir automáticamente un archivo PDF a la máquina virtual y abrirlo en Vista previa. Para cualquiera 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 dará este mensaje de error:Mensaje de error

Este es solo un archivo PDF de muestra, también lo probé con un par de otros PDF. Este error no ocurre cuando abro el archivo haciendo doble clic en él. Solo cuando trato de escribirlo. El error tampoco ocurre siempre que el archivo se haya abierto manualmente una vez.

También hay un par de otros errores (rutas desinfectadas).

error en la 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

  • Reparar los permisos del disco usando la utilidad de disco y reiniciar la VM
  • Cambiando los permisos del archivo a 777 antes de abrir
  • Eliminar cualquier atributo de archivo adicional (como cuarentena) con xattr antes de abrir

El resultado de ls -l@en el directorio muestra que los permisos del 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 hará.

Sin embargo, necesito poder obtener el pid del proceso de vista previa que se inició (mi secuencia de comandos se ha simplificado para esto, por lo que no era obvio) y no veo ninguna forma de hacerlo con abierto, especialmente con varios procesos de vista previa potencialmente ejecutándose. Es posible que necesite una pregunta separada para eso.

Más información para cualquier otra persona con este problema
La causa principal de este problema parece ser el entorno limitado de aplicaciones de Apple. Aparentemente, intentar escribirlo de esta manera no funciona con la caja de arena, pero "abrir" pasa por los canales adecuados para satisfacer cualquier requisito que tenga la caja de arena.

¿Sobre qué subprocess.call(['open','-a','Preview',path])? Funciona para mi.
Hmm, sí, eso funciona. Me pregunto qué hace eso diferente. Sin embargo, necesito rastrear el pid de los diferentes procesos de Vista previa, y no veo ninguna forma de hacerlo con open. Tal vez necesito otra pregunta para eso...
@Prueba: si la razón por la que necesita el pid es saber cuándo se cerró la vista previa, puede usar open -nWa Preview $pdfpara hacer que el comando no regrese hasta que finalice el proceso de vista previa generado (-n es para crear una nueva instancia).
Desafortunadamente, necesito el pid para más que eso: envío Preview un par de comandos, no estoy realmente tan interesado en cuándo sale. He estado buscando mucho en Google sobre abrir y obtener pids, pero todo lo que obtengo es que realmente no es posible. Entonces "abrir" no funcionará en mi caso específico. Sin embargo, si desea publicar su comando como respuesta, @aglasser, lo aceptaré, ya que responde a la pregunta original incluso si no puedo usarlo.
fwiw, tengo un problema similar, pero no de python: tengo un montón de archivos jpg creados por matplotlib y rsync'd desde un servidor ubuntu a mi mac. La mayoría de ellos se pueden abrir en Vista previa, pero hay un subconjunto que no puede, con el error anterior. Los permisos son todos idénticos, por lo que Preview miente sobre los permisos...
Resuelto al salir de la vista previa según apple.stackexchange.com/a/223165/42929
@drevicko Lamentablemente, eso no funciona para mí, aunque esta pregunta es bastante antigua en este momento. La vista previa no estaba abierta al principio (solo la inicio cuando quiero abrir un archivo y el archivo no se ha abierto previamente), e iniciarlo y detenerlo sin abrir un archivo no cambia nada. Aunque es posible que haya alguna diferencia en las versiones preliminares más recientes.

Respuestas (2)

He probado esto un poco en mi tiempo libre hoy, y parece que subprocess.call(['open','-a','Preview',path])es su mejor opción para abrir archivos PDF en Vista previa desde Python.

Sin embargo, todavía no estoy seguro de por qué no funciona el uso de la ruta absoluta a la vista previa.

Estoy tratando de encontrar una manera de obtener un PID de proceso basado en su título de ventana en AppleScript. Por ejemplo, si abriera un documento llamado "Prueba.png" en Vista previa con ese comando, generaría una ventana de Vista previa con el título de ventana "Prueba". Espero que haya una manera de obtener el PID de este proceso usando el título de la ventana, pero aún no estoy seguro.

Gracias, avíseme si encuentra algo prometedor en el enfoque de PID a través del título de la ventana.

Parece que la vista previa a veces se confunde con los permisos. Esta respuesta resolvió un problema similar simplemente saliendo de la vista previa.