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:
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
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.
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.
Parece que la vista previa a veces se confunde con los permisos. Esta respuesta resolvió un problema similar simplemente saliendo de la vista previa.
acristalador
subprocess.call(['open','-a','Preview',path])
? Funciona para mi.Pruebas
0942v8653
open -nWa Preview $pdf
para hacer que el comando no regrese hasta que finalice el proceso de vista previa generado (-n es para crear una nueva instancia).Pruebas
drevicko
drevicko
Pruebas