Sejauh yang saya tahu, Python memiliki 3 cara untuk mengetahui sistem operasi apa yang sedang berjalan:
os.name
sys.platform
platform.system()
Mengetahui informasi ini sering kali berguna dalam impor bersyarat, atau menggunakan fungsionalitas yang berbeda antar platform (misalnya time.clock()
di Windows vs time.time()
di UNIX).
Pertanyaan saya adalah, mengapa 3 cara berbeda untuk melakukan ini? Kapan satu cara harus digunakan dan bukan yang lain? Cara manakah yang 'terbaik' (paling tahan masa depan atau paling tidak mungkin secara tidak sengaja mengecualikan sistem tertentu tempat program Anda sebenarnya dapat berjalan)?
Sepertinya sys.platform
lebih spesifik daripada os.name
, memungkinkan Anda untuk membedakan win32
dari cygwin
(sebagai lawan dari hanya nt
), dan linux2
dari darwin
(sebagai lawan dari hanya posix
). Tetapi jika demikian, bagaimana dengan perbedaan antara sys.platform
dan platform.system()
?
Misalnya, mana yang lebih baik, ini:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
atau ini? :
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Untuk saat ini saya akan bertahan sys.platform
, jadi pertanyaan ini tidak terlalu mendesak, tetapi saya akan sangat berterima kasih atas beberapa klarifikasi mengenai hal ini.
sumber
sys.platform.startswith('linux')
alih-alihsys.platform == 'linux2'
untuk kompatibilitas di masa mendatangJawaban:
Menyelam sedikit ke dalam kode sumber.
Keluaran dari
sys.platform
danos.name
ditentukan pada waktu kompilasi.platform.system()
menentukan jenis sistem pada waktu proses.sys.platform
ditetapkan sebagai yang ditentukan kompiler selama konfigurasi build.os.name
memeriksa apakah modul khusus os tertentu yang tersedia (misalnyaposix
,nt
, ...)platform.system()
benar-benar berjalanuname
dan berpotensi beberapa fungsi lain untuk menentukan jenis sistem pada waktu proses.Saran saya:
os.name
untuk memeriksa apakah itu sistem yang sesuai dengan posix.sys.platform
untuk memeriksa apakah itu linux, cygwin, darwin, atheos, dll.platform.system()
jika Anda tidak mempercayai sumber lain.sumber
Ada perbedaan garis tipis antara
platform.system()
dansys.platform
dan yang menarik untuk kebanyakan kasusplatform.system()
merosot menjadisys.platform
Berikut adalah apa Sumber
Python2.7\Lib\Platform.py\system
mengatakanJuga sesuai dokumentasi
sumber
Dari
sys.platform
dokumen :os.name
memiliki perincian yang lebih kasaros.uname()
memberikan informasi versi yang bergantung pada sistemplatform
modul menyediakan pemeriksaan rinci untuk identitas sistemSeringkali cara yang "terbaik" untuk masa depan untuk menguji apakah beberapa fungsionalitas tersedia hanya dengan mencoba menggunakannya dan menggunakan fallback jika gagal.
platform.system()
mengembalikan nilai normalisasi yang mungkin mendapatkan dari beberapa sumber:os.uname()
,sys.platform
,ver
perintah (pada Windows).sumber
Itu tergantung pada apakah Anda lebih suka memunculkan pengecualian atau mencoba sesuatu pada sistem yang belum diuji dan apakah kode Anda sangat tinggi atau sangat rendah sehingga dapat atau tidak dapat bekerja pada sistem serupa yang belum diuji (misalnya Mac yang belum diuji - 'posix' atau pada sistem ARM tertanam). Lebih pythonic adalah tidak menghitung semua sistem yang dikenal tetapi untuk menguji kemungkinan properti yang relevan. (misalnya dianggap penting sebagai endianess dari sistem tetapi properti multiprosesing tidak penting.)
os.name adalah resolusi yang cukup untuk penggunaan
os
modul yang benar. Nilai yang memungkinkan adalah 'posix', 'nt', 'os2', 'ce', 'java' atau 'riscos' dengan Python 2.7, sementara hanya 'posix', 'nt' dan 'java' yang digunakan sejak Python 3.4.sys.platform adalah resolusi yang lebih baik. Disarankan untuk menggunakan
if sys.platform.startswith('linux')
idiom karena "linux2" berarti kernel Linux versi 2.xx atau 3. Kernel yang lebih lama saat ini tidak pernah digunakan. Dalam Python 3.3 adalah semua sistem Linux sederhana 'linux'.Saya tidak tahu secara spesifik dari sistem "Mac" dan "Java" sehingga saya tidak dapat menggunakan hasil dari metode platform.system () yang sangat bagus untuk percabangan, tetapi saya akan menggunakan kelebihan
platform
modul untuk pesan dan error logging.sumber
os.name
mungkin kembali nilai-nilai yang'posix'
,'nt'
,'java'
menurut Python 3 docs . Lihat juga: dokumen modul platform . Saya tidak percaya'riscos'
dan'os2
'adalah kemungkinan nilai kembali darios.name
; mereka mungkin mengembalikan nilai darisys.platform
. The Python 3sys.platform
dokumentasi tidak muncul untuk menjadi lengkap.os.name
konsisten di semua versi. Saya juga tidak memeriksa ulang dokumentasi 2.7 , tapi sekarang saya tahu Anda benar.Saya yakin modul platform mungkin lebih disukai untuk kode baru. Yang lainnya sudah ada sebelumnya. Ini adalah evolusi, dan yang lainnya tetap untuk kompatibilitas ke belakang.
sumber