1. ホーム
  2. python

[解決済み] WindowsとMac OSの両方で、PythonでOSのデフォルトアプリケーションでドキュメントを開く

2022-04-28 10:15:49

質問

WindowsとMac OSで、デフォルトのアプリケーションを使用して文書を開くことができるようにする必要があります。基本的には、エクスプローラやファインダでドキュメントのアイコンをダブルクリックしたときと同じことをしたいのです。Pythonでこれを行う最良の方法は何でしょうか?

どのように解決するのですか?

openstart は、それぞれMac OS/XとWindows用のコマンドインタプリタのようなもので、これを実行するためのものです。

Pythonからこれらを呼び出すには、以下のどちらかを使用します。 subprocess モジュールまたは os.system() .

ここでは、どのパッケージを使用するかについて検討します。

  1. を介して呼び出すことができます。 os.system で、これはうまくいくのですが......。

    逃げること。 os.system は、パス名にスペースや他のシェルメタキャラクタを含まないファイル名でのみ動作します (例. A:\abc\def\a.txt )でなければ、これらをエスケープする必要があります。そこには shlex.quote Unix 系のシステム用にはありますが、Windows 用の標準的なものはありません。おそらく python, windows : shlex によるコマンドラインのパース

    • MacOS/Xの場合。 os.system("open " + shlex.quote(filename))
    • Windows os.system("start " + filename) 正しくは filename もエスケープされるべきです。
  2. を経由して呼び出すこともできます。 subprocess モジュールがありますが...

    Python 2.7 以降の場合は、単純に

    subprocess.check_call(['open', filename])
    
    

    Python 3.5+では、同等に、少し複雑ですが、より汎用性の高い

    subprocess.run(['open', filename], check=True)
    
    

    Python 2.4まで互換性が必要な場合は subprocess.call() を作成し、独自のエラーチェックを実装します。

    try:
        retcode = subprocess.call("open " + filename, shell=True)
        if retcode < 0:
            print >>sys.stderr, "Child was terminated by signal", -retcode
        else:
            print >>sys.stderr, "Child returned", retcode
    except OSError, e:
        print >>sys.stderr, "Execution failed:", e
    
    

    さて、このような場合、どのような利点があるでしょうか。 subprocess ?

    • セキュリティ 理論的にはこちらの方が安全ですが、実際にはどちらにしてもコマンドラインを実行する必要があります。どちらの環境でも、解釈やパスの取得などのために環境とサービスが必要です。 どちらの場合も、任意のテキストを実行しているわけではないので、固有の"を持つわけではありませんが、次のように入力することができます。 'filename ; rm -rf /' という問題、そして もし を使用すると、ファイル名が壊れる可能性があります。 subprocess.call を使用することで、ほとんど追加的な保護が得られます。
    • エラー処理。 実際には、これ以上のエラー検出はできません。 retcode しかし、エラーが発生した場合に明示的に例外を発生させるという動作は、失敗があった場合に確実に気づくのに役立ちます (ただし、シナリオによっては、トレースバックは単にエラーを無視するよりもまったく役に立たないかもしれません)。
    • (ノンブロッキング)サブプロセスを起動します。 : 問題文によって別プロセスを起動しているので、子プロセスを待つ必要はない。

    異議申し立てに対して "しかし subprocess が好ましい。" ただし。 os.system() は非推奨ではなく、ある意味、この特殊な仕事には最もシンプルなツールです。結論 os.system() というのも正解です。

    マーク デメリット は、Windowsの start コマンド が必要です。 を渡す必要があります。 shell=True を使う利点はほとんどありません。 subprocess .