Saya harus dapat membuka dokumen menggunakan aplikasi standarnya di Windows dan Mac OS. Pada dasarnya, saya ingin melakukan hal yang sama yang terjadi ketika Anda mengklik dua kali pada ikon dokumen di Explorer atau Finder. Apa cara terbaik untuk melakukan ini dengan Python?
126
Jawaban:
open
danstart
hal-hal interpreter perintah untuk Mac OS / X dan Windows masing-masing, untuk melakukan ini.Untuk memanggil mereka dari Python, Anda bisa menggunakan
subprocess
modul atauos.system()
.Berikut adalah pertimbangan paket mana yang akan digunakan:
Anda dapat memanggil mereka melalui
os.system
, yang berfungsi, tetapi ...Melarikan diri:
os.system
hanya berfungsi dengan nama file yang tidak memiliki spasi atau karakter meta shell lain di pathname (mis.A:\abc\def\a.txt
), Atau ini harus diloloskan. Adashlex.quote
untuk sistem mirip Unix, tetapi tidak ada yang benar-benar standar untuk Windows. Mungkin lihat juga python, windows: parsing baris perintah dengan shlexos.system("open " + shlex.quote(filename))
os.system("start " + filename)
mana berbicara dengan benarfilename
harus lolos juga.Anda juga dapat memanggil mereka melalui
subprocess
modul, tetapi ...Untuk Python 2.7 dan yang lebih baru, cukup gunakan
Dalam Python 3.5+ Anda dapat menggunakan cara yang sedikit lebih rumit tetapi juga agak lebih setara
Jika Anda harus kompatibel kembali ke Python 2.4, Anda dapat menggunakan
subprocess.call()
dan mengimplementasikan pemeriksaan kesalahan Anda sendiri:Sekarang, apa keuntungan menggunakan
subprocess
?'filename ; rm -rf /'
" yang melekat , dan jika nama file dapat rusak, menggunakansubprocess.call
memberi kami sedikit perlindungan tambahan.retcode
dalam kedua kasus; tetapi perilaku untuk secara eksplisit meningkatkan pengecualian dalam kasus kesalahan pasti akan membantu Anda memperhatikan jika ada kegagalan (meskipun dalam beberapa skenario, traceback mungkin sama sekali tidak lebih membantu daripada mengabaikan kesalahan).Untuk keberatan "Tetapi
subprocess
lebih disukai." Namun,os.system()
tidak usang, dan dalam beberapa hal alat paling sederhana untuk pekerjaan khusus ini. Kesimpulan: menggunakanos.system()
karena itu juga merupakan jawaban yang benar.Kerugian yang ditandai adalah bahwa
start
perintah Windows mengharuskan Anda untuk lulusshell=True
yang meniadakan sebagian besar manfaat menggunakansubprocess
.sumber
filename
bentuknya, ini adalah contoh sempurna mengapa os.system () tidak aman dan buruk. subproses lebih baik.os.system()
adalah bahwa ia menggunakan shell (dan Anda tidak melakukan shell melarikan diri di sini, sehingga Hal Buruk akan terjadi untuk nama file yang valid sempurna yang mengandung karakter meta shell). Alasan mengapasubprocess.call()
lebih disukai adalah bahwa Anda memiliki opsi untuk memotong shell dengan menggunakansubprocess.call(["open", filename])
. Ini berfungsi untuk semua nama file yang valid, dan tidak memperkenalkan kerentanan injeksi shell bahkan untuk nama file yang tidak terpercaya.Gunakan
subprocess
modul yang tersedia di Python 2.4+, tidakos.system()
, jadi Anda tidak harus berurusan dengan shell escape.Tanda kurung ganda karena
subprocess.call()
menginginkan urutan sebagai argumen pertama, jadi kami menggunakan tuple di sini. Pada sistem Linux dengan Gnome ada jugagnome-open
perintah yang melakukan hal yang sama, tetapixdg-open
merupakan standar Free Desktop Foundation dan bekerja di seluruh lingkungan desktop Linux.sumber
xdg-open
- linux.die.net/man/1/xdg-openxdg-open test.py
dan membuka dialog unduhan firefox untuk saya. Apa yang salah? Saya di manjaro linux.xdg-open
konfigurasi Anda bingung, tapi itu bukan sesuatu yang bisa kami atasi dalam komentar. Mungkin lihat unix.stackexchange.com/questions/36380/…Saya lebih memilih:
Perhatikan bahwa modul ini mendukung nama file yang memiliki spasi di folder dan file mereka misalnya
( python docs ) 'terbuka' tidak harus ditambahkan (ini adalah default). Dokumen secara khusus menyebutkan bahwa ini seperti mengklik dua kali pada ikon file di Windows Explorer.
Solusi ini hanya untuk windows.
sumber
startfile
fungsi itu bahkan tidak ada, yang berarti bahwa pengguna akan mendapatkan pesan kesalahan yang membingungkan tentang fungsi yang hilang. Anda mungkin ingin memeriksa platform untuk menghindari ini.Hanya untuk kelengkapan (bukan dalam pertanyaan), xdg-open akan melakukan hal yang sama di Linux.
sumber
sumber
Jika Anda harus menggunakan metode heuristik, Anda dapat mempertimbangkan
webbrowser
.Ini perpustakaan standar dan meskipun namanya juga akan mencoba untuk membuka file:
Saya mencoba kode ini dan berfungsi baik di Windows 7 dan Ubuntu Natty:
Kode ini juga berfungsi dengan baik di Windows XP Professional, menggunakan Internet Explorer 8.
sumber
open location
ada yang harus bekerja jika Anda memberikan path sebagai url yang valid.import webbrowser webbrowser.open("file:///Users/nameGoesHere/Desktop/folder/file.py")
Jika Anda ingin melakukannya
subprocess.call()
, seharusnya terlihat seperti ini di Windows:Anda tidak bisa hanya menggunakan:
karena
start
bukan merupakan executable tetapi perintahcmd.exe
program. Ini bekerja:tetapi hanya jika tidak ada spasi di FILE_NAME.
Sementara
subprocess.call
metodeenmengutip parameter dengan benar,start
perintah tersebut memiliki sintaks yang agak aneh, di mana:melakukan sesuatu selain:
String yang dikutip pertama harus mengatur judul jendela. Untuk membuatnya bekerja dengan spasi, kita harus melakukan:
yang dilakukan oleh kode di atas.
sumber
Mulai tidak mendukung nama jalur panjang dan spasi putih. Anda harus mengubahnya menjadi 8,3 jalur yang kompatibel.
File harus ada agar dapat berfungsi dengan panggilan API.
sumber
start "Title" "C:\long path to\file.avi"
Saya cukup terlambat ke tempat parkir, tapi di sini ada solusi menggunakan windows api. Ini selalu membuka aplikasi terkait.
Banyak konstanta sihir. Nol pertama adalah jumlah program saat ini. Bisa nol. Dua nol lainnya adalah parameter opsional (parameter dan direktori). 5 == SW_SHOW, ini menentukan cara menjalankan aplikasi. Baca dokumen ShellExecute API untuk info lebih lanjut.
sumber
os.startfile(file)
?di mac os Anda dapat memanggil 'open'
ini akan membuka file dengan TextEdit, atau aplikasi apa pun yang ditetapkan sebagai default untuk tipe file ini
sumber
Jika Anda ingin menentukan aplikasi untuk membuka file dengan di Mac OS X, gunakan ini:
os.system("open -a [app name] [file name]")
sumber
Pada windows 8.1, di bawah ini telah berfungsi sementara cara lain yang diberikan dengan
subprocess.call
gagal dengan path memiliki spasi di dalamnya.Dengan memanfaatkan jawaban ini dan yang lain sebelumnya, inilah kode sebaris yang berfungsi pada banyak platform.
sumber
os.startfile(path, 'open')
di bawah Windows adalah baik karena ketika ruang ada di direktori,os.system('start', path_name)
tidak dapat membuka aplikasi dengan benar dan ketika i18n ada di direktori,os.system
perlu mengubah unicode ke codec konsol di Windows.sumber