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のアプリケーションサンドボックスであるようです。どうやらこの方法でスクリプトを作成しようとすると、サンドボックスでは機能しませんが、「オープン」はサンドボックスの要件をすべて満たすために適切なチャネルを通過します。
open -nWa Preview $pdf
、生成されたPreviewプロセスが終了するまでコマンドを返さないようにするために使用できます(-nは新しいインスタンスを作成するためです)。
subprocess.call(['open','-a','Preview',path])
?私のために働く。