2010-12-29 12 views
70

Theo như tôi biết, Python có 3 cách để tìm hiểu hệ điều hành gì đang chạy trên:Khi nào nên sử dụng os.name, sys.platform hoặc platform.system?

  1. os.name
  2. sys.platform
  3. platform.system()

Biết thông tin này thường rất hữu ích trong nhập khẩu có điều kiện hoặc sử dụng chức năng khác nhau giữa các nền tảng (ví dụ: time.clock() trên Windows so với time.time() trên UNIX).

Câu hỏi của tôi là tại sao 3 cách khác nhau để thực hiện việc này? Khi nào nên sử dụng một cách và không phải cách khác? Cách nào là 'tốt nhất' (hầu hết bằng chứng trong tương lai hoặc ít có khả năng vô tình loại trừ một hệ thống cụ thể mà chương trình của bạn thực sự có thể chạy)?

Nó có vẻ như sys.platform là cụ thể hơn so os.name, cho phép bạn phân biệt win32 từ cygwin (như trái ngược với chỉ nt), và linux2 từ darwin (như trái ngược với chỉ posix). Nhưng nếu đó là như vậy, rằng những gì về sự khác biệt giữa sys.platformplatform.system()?

Ví dụ, mà là tốt hơn, điều này:

import sys 
if sys.platform == 'linux2': 
    # Do Linux-specific stuff 

hoặc này? :

import platform 
if platform.system() == 'Linux': 
    # Do Linux-specific stuff 

Hiện tại, tôi không thể giải thích được vấn đề này, nhưng tôi sẽ rất biết ơn vì đã giải thích rõ điều này.

+11

sử dụng 'sys.platform.startswith ('linux')' thay vì 'sys.platform == 'linux2'' để tương thích trong tương lai – jfs

Trả lời

2

Tôi tin rằng mô-đun nền tảng có thể được ưu tiên cho mã mới. Những người khác tồn tại trước đó. Nó là một sự tiến hóa, và những người khác vẫn còn cho khả năng tương thích ngược.

+6

Tôi tự hỏi liệu chúng ta có thể nhận được bất kỳ nhà phát triển Python nào để xác nhận điều này không. Có lẽ ngay cả bất cứ ai phát triển mô-đun nền tảng. – ztangent

8

Từ sys.platform docs:

  • os.name có granularity thô
  • os.uname() cho hệ thống phụ thuộc vào thông tin phiên bản
  • Module platform cung cấp kiểm tra chi tiết cho danh tính của hệ thống

Thường thì " tốt nhất "cách chứng minh tương lai để kiểm tra xem một số chức năng có sẵn chỉ là t ry để sử dụng nó và sử dụng một dự phòng nếu nó không thành công.

sự khác biệt giữa sys.platform và platform.system() là gì?

platform.system() trả về giá trị bình thường mà nó có thể nhận được từ nhiều nguồn khác nhau: os.uname(), sys.platform, ver lệnh (trên Windows).

49

Dived một chút vào mã nguồn.

Đầu ra của sys.platformos.name được xác định tại thời gian biên dịch. platform.system() xác định loại hệ thống tại thời gian chạy.

  • sys.platform được chỉ định làm trình biên dịch xác định trong cấu hình xây dựng.
  • os.name kiểm tra xem một số os module cụ có sẵn (ví dụ posix, nt ...)
  • platform.system() thực sự chạy uname và có khả năng một số chức năng khác để xác định loại hệ thống tại thời gian chạy.

Đề nghị của tôi, sử dụng os.name để kiểm tra xem đó là một hệ thống posix tuân thủ, sử dụng sys.platform để kiểm tra xem đó là một linux, Cygwin, darwin, atheos, bất cứ điều gì, và sử dụng platform.system(), tốt, nếu bạn không tin các nguồn khác.

18

Có sự khác biệt ranh giới mỏng manh giữa platform.system()sys.platform và thú vị đối với hầu hết các trường hợp platform.system() degenerates để sys.platform

Dưới đây là những gì các Nguồn Python2.7\Lib\Platform.py\system nói

def system(): 

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'. 

     An empty string is returned if the value cannot be determined. 

    """ 
    return uname()[0] 

def uname(): 
    # Get some infos from the builtin os.uname API... 
    try: 
     system,node,release,version,machine = os.uname() 
    except AttributeError: 
     no_os_uname = 1 

    if no_os_uname or not filter(None, (system, node, release, version, machine)): 
     # Hmm, no there is either no uname or uname has returned 
     #'unknowns'... we'll have to poke around the system then. 
     if no_os_uname: 
      system = sys.platform 
      release = '' 
      version = '' 
      node = _node() 
      machine = '' 

Cũng theo documentation

os.uname()

Trả về thông tin chứa 5 thông tin nhận dạng hệ điều hành hiện tại. Tuple chứa 5 chuỗi: (sysname, nodename, phát hành, phiên bản, máy). Một số hệ thống cắt tên nodename thành 8 ký tự hoặc thành phần hàng đầu; cách tốt hơn để có được tên máy chủ là socket.gethostname() hoặc thậm chí socket.gethostbyaddr (socket.gethostname()).

Availability: recent flavors of Unix. 
7

Nó phụ thuộc vào việc bạn muốn nâng cao ngoại lệ hoặc cố gắng bất cứ điều gì trên một hệ thống chưa được kiểm tra và liệu mã của bạn là mức độ quá cao hoặc quá thấp mức độ mà nó có thể hoặc không thể làm việc trên một hệ thống chưa được kiểm tra tương tự (ví dụ: Mac chưa được kiểm tra - 'posix' hoặc trên các hệ thống ARM được nhúng). Thêm pythonic là không liệt kê tất cả các hệ thống đã biết nhưng để kiểm tra các tính chất có liên quan. (Ví dụ nó được coi là quan trọng endianess của hệ thống nhưng tính đa xử lý không quan trọng.)

  • os.name là một độ phân giải đầy đủ cho việc sử dụng đúng đắn về os module. Các giá trị có thể là 'posix', 'nt', 'os2', 'ce' hoặc 'riscos' có lẽ chỉ có hai giá trị đầu tiên là quan trọng nhất.

  • sys.platform là độ phân giải tốt hơn. Bạn nên sử dụng thành ngữ if sys.platform.startswith('linux') vì "linux2" có nghĩa là phiên bản hạt nhân Linux 2.xx hoặc 3. Các hạt cũ hơn hiện không bao giờ được sử dụng. Trong Python 3.3 là tất cả các hệ thống Linux đơn giản 'linux'.

Tôi không biết chi tiết về hệ thống "Mac" và "Java" và vì vậy tôi không thể sử dụng kết quả của nền tảng phương pháp rất tốt.system() cho phân nhánh, nhưng tôi sẽ sử dụng các ưu điểm của mô-đun platform cho các thông báo và ghi nhật ký lỗi.