ファイルを開かないプレビュー-権限の問題(Python経由)


3

Mavericks(10.9.3)を実行しているMac VMがあり、さまざまな理由で、PDFファイルをVMに自動的に転送してプレビューで開くスクリプトをPythonで記述しようとしています。知らない人のために、コマンド<path-to-Preview> <path-to-file>はファイルを開きます。

スクリプトを実行すると、プレビューが開きますが、次のエラーメッセージが表示されます。 エラーメッセージ

これは単なるサンプルPDFファイルです。他のPDFでも試してみました。ファイルをダブルクリックして開くと、このエラーは発生しません。スクリプトを作成しようとしたときのみ。ファイルが一度手動で開かれている限り、エラーは発生しません。

他にもいくつかエラーがあります(パスはサニタイズされます)。

ターミナルのエラー

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"}

コンソールのエラー

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

試したこと

  • ディスクユーティリティを使用してディスクのアクセス許可を修復し、VMを再起動する
  • 開く前にファイルのアクセス許可を777に変更する
  • 開く前にxattrで余分なファイル属性(検疫など)を削除する

ls -l@ディレクトリ内の結果は、ファイルのパーミッションが次のとおりであることを示しています。

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

スクリプトの関連部分は次のようになります。

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

編集: aglasserのコメントによると、subprocess.call(['open','-a','Preview',path])私のコマンドが動作しない場所で動作します。

ただし、開始されたプレビュープロセスのPIDを取得する必要があります(このため、私のスクリプトは簡略化されているため、明確ではありませんでした)。複数のプレビュープロセスが実行されている可能性があります。そのために別の質問が必要な場合があります。

この問題を抱えている他の人のための詳細情報この問題
の根本的な原因は、Appleのアプリケーションサンドボックスであるようです。どうやらこの方法でスクリプトを作成しようとすると、サンドボックスでは機能しませんが、「オープン」はサンドボックスの要件をすべて満たすために適切なチャネルを通過します。


どうsubprocess.call(['open','-a','Preview',path])?私のために働く。
アグラー14

うーん、はい、それは動作します。それはどう違うのかしら。ただし、さまざまなプレビュープロセスのPIDを追跡する必要があり、openでそれを行う方法がわかりません。たぶん私は、そのための別の質問を必要とする...
テスト

@Testing:pidが必要な理由がPreviewがいつ終了したかを知るためである場合open -nWa Preview $pdf、生成されたPreviewプロセスが終了するまでコマンドを返さないようにするために使用できます(-nは新しいインスタンスを作成するためです)。
0942v8653 14

残念ながら、それ以上のpidが必要です-Previewにいくつかのコマンドを送信しますが、Previewが終了するときはあまり興味がありません。私はオープンでpidを取得するために多くのグーグルを行ってきましたが、私が得ているのはそれが本当に不可能だということです。したがって、特定のケースでは「オープン」は機能しません。コマンドを回答として投稿したい場合は、@ aglasser、それを受け入れます。使用できない場合でも元の質問に回答するからです。
テスト14

fwiw私は同様の問題を抱えていますが、Pythonからではありません:matplotlibによって作成され、ubuntuサーバーからMacにrsyncされたjpgファイルがたくさんあります。それらのほとんどはプレビューで開くことができますが、上記のエラーにより、開くことができないサブセットがあります。プレビュー...権限について嘘をついているので、アクセス権は、すべて同じです
drevicko

回答:


0

今日は自由時間でこれを少しテストしましたsubprocess.call(['open','-a','Preview',path])が、PythonからPreviewでPDFを開くための最良の選択肢であると思われます。

ただし、プレビューへの絶対パスを使用しても機能しない理由はまだわかりません。

AppleScriptのウィンドウタイトルに基づいてプロセスPIDを取得する方法を探しています。たとえば、プレビューで「Test.png」という名前のドキュメントをそのコマンドで開くと、「Test」というウィンドウタイトルのプレビューウィンドウが表示されます。ウィンドウタイトルを使用してこのプロセスのPIDを取得する方法があることを望んでいますが、まだわかりません。


ありがとう、PID-via-window-titleアプローチで有望なものを見つけたら教えてください。
テスト14

0

プレビューは時々ペミッションと混同されるようです。同様の問題は、プレビューを終了するだけでこの回答により解決されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.