回答:
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でコマンドラインを解析する
os.system("open " + shlex.quote(filename))
os.system("start " + filename)
適切に話すfilename
ことも回避する必要がある場合。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
。
filename
来るかによって、これはos.system()が安全でなく、悪い理由の完璧な例です。サブプロセスが優れています。
os.system()
は、シェルを使用することです(ここではシェルエスケープを実行していないため、シェルのメタ文字が含まれている完全に有効なファイル名で問題が発生します)。subprocess.call()
推奨される理由は、を使用してシェルをバイパスするオプションがあるためsubprocess.call(["open", filename])
です。これはすべての有効なファイル名で機能し、信頼できないファイル名であっても、シェル注入の脆弱性をもたらすことはありません。
使用subprocess
のPython 2.4+で利用可能なモジュールを、ないos.system()
、あなたはシェルエスケープに対処する必要はありませんので。
import subprocess, os, platform
if platform.system() == 'Darwin': # macOS
subprocess.call(('open', filepath))
elif platform.system() == 'Windows': # Windows
os.startfile(filepath)
else: # linux variants
subprocess.call(('xdg-open', filepath))
二重括弧はsubprocess.call()
、最初の引数としてシーケンスが必要なため、ここではタプルを使用しています。Gnomeを使用するLinuxシステムでgnome-open
は、同じことを行うコマンドもありますxdg-open
が、Free Desktop Foundationの標準であり、Linuxデスクトップ環境全体で機能します。
xdg-open
- linux.die.net/man/1/xdg-open
xdg-open test.py
と、Firefoxのダウンロードダイアログが開きました。どうしましたか?私はmanjaro linuxを使っています。
xdg-open
構成が混乱しているように聞こえますが、それはコメントでトラブルシューティングできるものではありません。unix.stackexchange.com/questions/36380/…を
私は好む:
os.startfile(path, 'open')
このモジュールは、フォルダとファイルにスペースがあるファイル名をサポートしていることに注意してください。
A:\abc\folder with spaces\file with-spaces.txt
(python docs) 'open'を追加する必要はありません(デフォルトです)。ドキュメントでは、これはWindowsエクスプローラーでファイルのアイコンをダブルクリックするようなものであると具体的に述べています。
このソリューションはWindowsのみです。
startfile
するのではなく、関数が存在しません。つまり、関数が見つからないという混乱したエラーメッセージが表示されます。これを回避するためにプラットフォームを確認することをお勧めします。
import os
import subprocess
def click_on_file(filename):
'''Open document with default application in Python.'''
try:
os.startfile(filename)
except AttributeError:
subprocess.call(['open', filename])
ヒューリスティックな方法を使用する必要がある場合は、を検討してくださいwebbrowser
。
これは標準ライブラリであり、その名前にもかかわらず、ファイルを開こうとします。
一部のプラットフォームでは、この関数を使用してファイル名を開こうとすると、動作し、オペレーティングシステムの関連プログラムが起動する場合があります。ただし、これはサポートされておらず、移植性もありません。(参考)
私はこのコードを試してみましたが、Windows 7とUbuntu Nattyでは問題なく動作しました。
import webbrowser
webbrowser.open("path_to_file")
このコードは、Internet Explorer 8を使用するWindows XP Professionalでも正常に機能します。
import webbrowser webbrowser.open("file:///Users/nameGoesHere/Desktop/folder/file.py")
先に進む場合はsubprocess.call()
、Windowsでは次のようになります。
import subprocess
subprocess.call(('cmd', '/C', 'start', '', FILE_NAME))
あなただけを使うことはできません:
subprocess.call(('start', FILE_NAME))
start
実行可能ファイルではなく、cmd.exe
プログラムのコマンドだからです。これは機能します:
subprocess.call(('cmd', '/C', 'start', FILE_NAME))
ただし、FILE_NAMEにスペースがない場合のみ。
一方でsubprocess.call
メソッドエンパラメータ適切に引用符は、start
コマンドではなく奇妙な構文を持っています:
start notes.txt
以外のことをします:
start "notes.txt"
最初に引用された文字列は、ウィンドウのタイトルを設定する必要があります。スペースで機能させるには、次のことを行う必要があります。
start "" "my notes.txt"
これが一番上のコードが行うことです。
Startは、長いパス名と空白をサポートしていません。8.3互換パスに変換する必要があります。
import subprocess
import win32api
filename = "C:\\Documents and Settings\\user\\Desktop\file.avi"
filename_short = win32api.GetShortPathName(filename)
subprocess.Popen('start ' + filename_short, shell=True )
API呼び出しを処理するには、ファイルが存在している必要があります。
start "Title" "C:\long path to\file.avi"
私はかなり遅くなっていますが、これはWindows APIを使用したソリューションです。これにより、常に関連するアプリケーションが開きます。
import ctypes
shell32 = ctypes.windll.shell32
file = 'somedocument.doc'
shell32.ShellExecuteA(0,"open",file,0,0,5)
たくさんの魔法の定数。最初のゼロは現在のプログラムのhwndです。ゼロにすることができます。他の2つのゼロはオプションのパラメーター(パラメーターとディレクトリー)です。5 == SW_SHOW、アプリの実行方法を指定します。詳細については、 ShellExecute APIドキュメントをご覧ください。
os.startfile(file)
ますか?
Mac OS Xでファイルを開くアプリを指定する場合は、次のようにします。
os.system("open -a [app name] [file name]")
Windows 8.1では、以下は機能しましたsubprocess.call
が、パスで失敗する他の特定の方法にはスペースが含まれています。
subprocess.call('cmd /c start "" "any file path with spaces"')
これと他の回答を以前に利用して、複数のプラットフォームで動作するインラインコードを次に示します。
import sys, os, subprocess
subprocess.call(('cmd /c start "" "'+ filepath +'"') if os.name is 'nt' else ('open' if sys.platform.startswith('darwin') else 'xdg-open', filepath))