Aperçu ne pas ouvrir le fichier - Problème d'autorisations (via Python)

3

J'ai une machine virtuelle Mac exécutant Mavericks (10.9.3) et, pour diverses raisons, j'essaie d'écrire un script en Python pour transférer automatiquement un fichier PDF sur la machine virtuelle et l'ouvrir dans Aperçu. Pour ceux qui ne le savent pas, la commande <path-to-Preview> <path-to-file>ouvrira le fichier.

Preview s’ouvrira à chaque exécution du script, mais donnera le message d’erreur suivant: Message d'erreur

Ceci est juste un exemple de fichier PDF, je l’ai essayé aussi avec quelques autres PDF. Cette erreur ne se produit pas lorsque j'ouvre le fichier en double-cliquant dessus. Seulement quand j'essaye de le scripter. L'erreur ne se produit pas non plus tant que le fichier a été ouvert manuellement une fois.

Il y a aussi quelques autres erreurs (chemins désinfectés).

Erreur dans le 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"}

Erreur dans la console

9:33:49 AM sandboxd: 
([276]) Preview(276) deny file-read-data path/The-Apple-Sandbox-BHDC2011-Paper.pdf

Choses que j'ai essayées

  • Réparation des autorisations de disque à l'aide de l'utilitaire de disque et redémarrage de la machine virtuelle
  • Modification des autorisations du fichier sur 777 avant ouverture
  • Supprimer tout attribut de fichier supplémentaire (comme la quarantaine) avec xattr avant de l'ouvrir

Le résultat de ls -l@dans le répertoire montre les autorisations de fichier sont:

-rwxrwxrwx  1 me  wheel  364378 Aug  7 14:54 The-Apple-Sandbox-BHDC2011-Paper.pdf

La partie pertinente de mon script ressemble à ceci:

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])

Edit: Comme le dit l'aglasser, subprocess.call(['open','-a','Preview',path])ça marche là où ma commande ne va pas.

Cependant, je dois pouvoir obtenir le pid du processus de prévisualisation démarré (mon script a été simplifié pour cela, donc ce n'était pas évident) et je ne vois aucun moyen de le faire avec open, en particulier avec plusieurs processus de prévisualisation potentiellement en cours d'exécution. J'ai peut-être besoin d'une question distincte pour cela.

Informations supplémentaires pour tous les utilisateurs présentant ce problème
La cause première de ce problème semble être le sandbox d'application d'Apple. Apparemment, tenter de le script de cette manière ne fonctionne pas avec le bac à sable, mais "ouvert" passe par les canaux appropriés pour satisfaire toutes les exigences du bac à sable.

Essai
la source
Qu'en est- il subprocess.call(['open','-a','Preview',path])? Travaille pour moi.
aglasser
Hmm, oui, ça marche. Je me demande ce que cela fait différemment. Cependant, je dois suivre le pid des différents processus de prévisualisation, et je ne vois aucun moyen de le faire avec open. J'ai peut-être besoin d'une autre question à ce sujet ...
Testé
@Testing: Si vous avez besoin du pid pour savoir quand Preview a été quitté, vous pouvez utiliser open -nWa Preview $pdfpour empêcher la commande de revenir jusqu'à la fin du processus de prévisualisation généré (-n sert à créer une nouvelle instance).
0942v8653
Malheureusement, j'ai besoin du pid pour plus que cela - j'envoie à Preview deux commandes, je ne suis pas vraiment intéressé par sa sortie. J'ai fait beaucoup de recherches sur Google et des pids, mais tout ce que je comprends, c'est que ce n'est vraiment pas possible. Donc, "ouvert" ne fonctionnera pas dans mon cas particulier. Si vous voulez poster votre commande comme réponse, @aglasser, je l'accepterai, car elle répond à la question initiale même si je ne peux pas l'utiliser.
Test du
fwiw J'ai un problème similaire, mais pas de python: j'ai un tas de fichiers jpg créés par matplotlib et synchronisés depuis un serveur Ubuntu vers mon mac. La plupart d'entre eux peuvent être ouverts dans Preview ok, mais il existe un sous-ensemble qui ne peut pas, avec l'erreur ci-dessus. Les autorisations sont toutes identiques, donc Preview ment au sujet des autorisations ...
drevicko

Réponses:

0

Je l'ai un peu testé pendant mon temps libre aujourd'hui, et il semble que ce subprocess.call(['open','-a','Preview',path])soit votre meilleure option pour ouvrir des fichiers PDF dans Preview à partir de Python.

Je ne comprends toujours pas pourquoi l'utilisation du chemin d'accès absolu vers Aperçu ne fonctionne pas.

J'essaie de trouver un moyen d'obtenir un PID de processus basé sur le titre de sa fenêtre dans AppleScript. Par exemple, si vous ouvriez un document nommé "Test.png" dans Aperçu avec cette commande, une fenêtre Aperçu avec le titre "Test" serait créée. J'espère qu'il est possible d'obtenir le PID de ce processus en utilisant le titre de la fenêtre, mais je ne suis pas encore sûr.

aglasser
la source
Merci de me faire savoir si vous trouvez quelque chose de prometteur dans l’approche PID-via-window-title.
Test du
0

Il semble que l'aperçu soit parfois confondu avec les pemissions. Cette réponse résout un problème similaire en quittant simplement Preview.

Drevicko
la source