[解決済み] WindowsとMac OSの両方で、PythonでOSのデフォルトアプリケーションでドキュメントを開く
質問
WindowsとMac OSで、デフォルトのアプリケーションを使用して文書を開くことができるようにする必要があります。基本的には、エクスプローラやファインダでドキュメントのアイコンをダブルクリックしたときと同じことをしたいのです。Pythonでこれを行う最良の方法は何でしょうか?
どのように解決するのですか?
open
と
start
は、それぞれMac OS/XとWindows用のコマンドインタプリタのようなもので、これを実行するためのものです。
Pythonからこれらを呼び出すには、以下のどちらかを使用します。
subprocess
モジュールまたは
os.system()
.
ここでは、どのパッケージを使用するかについて検討します。
-
を介して呼び出すことができます。
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
もエスケープされるべきです。
-
MacOS/Xの場合。
-
を経由して呼び出すこともできます。
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
. -
セキュリティ
理論的にはこちらの方が安全ですが、実際にはどちらにしてもコマンドラインを実行する必要があります。どちらの環境でも、解釈やパスの取得などのために環境とサービスが必要です。 どちらの場合も、任意のテキストを実行しているわけではないので、固有の"を持つわけではありませんが、次のように入力することができます。
関連
-
Pythonコンテナのための組み込み汎用関数操作
-
Pythonによるjieba分割ライブラリ
-
python implement mysql add delete check change サンプルコード
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] Python の open() はファイルが存在しない場合、ファイルを作成しない
-
[解決済み] Pythonで**kwargsを使用する正しい方法
-
[解決済み】Selenium WebDriverでPythonを使用してWebElementのHTMLソースを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
Python カメの描画コマンドとその例
-
python implement mysql add delete check change サンプルコード
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] サブプロセスにおける「shell=True」の実際の意味