2009-09-07 41 views
40

Tôi đang làm việc trên một vài công cụ Linux và cần phải ngăn cài đặt trên Windows, vì nó phụ thuộc vào FHS và do đó được hiển thị trên nền tảng đó. Hàm platform.platform đến gần nhưng chỉ trả về một chuỗi.Phát hiện Windows đáng tin cậy trong Python

Rất tiếc, tôi không biết nên tìm kiếm gì trong chuỗi đó để mang lại kết quả đáng tin cậy. Có ai biết những gì để tìm kiếm hoặc không ai biết chức năng khác mà tôi đang thiếu ở đây?

Trả lời

58
>>> import platform 
>>> platform.system() 
'Windows' 
9

Hãy thử điều này:

import platform 

if platform.system() == "Darwin": 
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it 

Edit: Chỉ cần thấy rằng bạn đã cố gắng platform.platform() ... platform.system() sẽ làm việc tốt hơn cho trường hợp này. Tôi tin tưởng, sử dụng nó. Góc tối nằm trong phát hiện nền tảng.

distutils cũng sẽ làm điều này, nếu bạn hỏi nó một cách độc đáo.

Bạn luôn có thể làm điều gì đó xấu như os.path.exists() trên tệp Windows ... nhưng platform là đáng tin cậy như trong thư viện chuẩn của Python.

Chỉnh sửa 2: Một người trả lời hữu ích khác chỉ ra platform.system() chính xác bằng "Windows" trên máy tính Windows của anh ấy.

+1

Tôi cũng không có Windows tiện dụng, nhưng chức năng này trả về 'Linux' trên máy của tôi. Các tài liệu dường như đề cập đến 'Windows', vì vậy tôi đoán tôi sẽ chỉ đi với điều đó và hy vọng rằng nó bao gồm tất cả các trường hợp. – blokkie

+0

Nên. Xem câu trả lời của Pax. –

+0

Ah, các chỉnh sửa của bạn đã xóa nó. Nhiều nghĩa vụ. – blokkie

16

Trên hộp Windows của tôi, platform.system() trả lại 'Windows'.

Tuy nhiên, tôi không chắc tại sao bạn lại bận tâm. Nếu bạn muốn giới hạn nền tảng nó chạy trên công nghệ, tôi sẽ sử dụng một danh sách trắng chứ không phải là một danh sách đen.

Trong thực tế, tôi sẽ không làm điều đó công nghệ ở tất cả vì có lẽ là phiên bản tiếp theo của Python có thể có Win32/Win64 thay vì Windows (ví đen niêm yết) và *nix thay vì Linux (đối với danh sách trắng).

Lời khuyên của tôi là chỉ cần nêu rõ yêu cầu là gì và, nếu người dùng chọn bỏ qua điều đó, đó là vấn đề của họ. Nếu họ đổ chuông nói rằng họ nhận được thông báo lỗi cho biết "Không thể tìm thấy FHS" và họ thừa nhận họ đang chạy trên Windows, hãy chỉ ra rằng họ không phải là cấu hình được hỗ trợ.

Có thể khách hàng của bạn đủ thông minh để có được FHS đang chạy trong Windows để mã của bạn hoạt động. Họ không thể đánh giá cao những gì họ sẽ xem xét một giới hạn tùy ý của phần mềm của bạn.

Đây là vấn đề mà các nhà phát triển phần mềm gặp phải hàng ngày. Ngay cả các tổ chức lớn cũng không thể hỗ trợ mỗi nền tảng và cấu hình duy nhất trên mạng.

+1

+1, câu trả lời hay và tôi đồng ý. Phát hiện ra rằng FHS không có sẵn là một phương pháp tốt hơn nhiều so với việc phát hiện hệ điều hành và đưa ra giả định, và nó an toàn hơn (sau khi tất cả, có ai đó hack xung quanh giới hạn nền tảng của bạn sẽ thất bại * anyway *!). –

+0

+1, có một danh sách trắng thích hợp hơn vì các trường hợp góc khó chịu. Chạy dưới Cygwin trên một hộp Windows, tôi nhận được 'platform.system()' return 'CYGWIN_NT-5.2-WOW64'. Đó không phải là dự đoán đầu tiên của tôi! –

2

Từ sự giúp đỡ (nền tảng)

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

    An empty string is returned if the value cannot be determined. 
5
>>> import os 
>>> os.name 
'nt' 

"Cái tên của hệ điều hành mô-đun phụ thuộc nhập khẩu Các tên gọi sau đây đã hiện được đăng ký:. 'Posix', 'nt', ' mac ',' os2 ',' ce ',' java ',' riscos '."(C) http://docs.python.org/library/os.html#os.name

import os 
if os.name == 'nt': 
    #yourcodehere 
+0

Ít nhất trên hộp của tôi 'os.name' trả về' posix' khi chạy dưới Cygwin, và 'nt' khi chạy dưới cửa sổ gốc xây dựng – sbk

+0

Có, Cygwin là một nỗi đau, nhưng đối với câu chuyện gốc, hành vi này được chấp nhận (nếu không muốn). –

46

Đối với những người đến đây tìm kiếm một cách để phát hiện Cygwin từ Python (như trái ngược với chỉ phát hiện Windows), đây là một số giá trị mẫu trở về từ os.nameplatform.system trên nền tảng khác nhau

OS/build  | os.name | platform.system() 
-------------+---------+----------------------- 
Win32 native | nt  | Windows 
Win32 cygwin | posix | CYGWIN_NT-5.1* 
Win64 native | nt  | Windows 
Win64 cygwin | posix | CYGWIN_NT-6.1-WOW64* 
Linux  | posix | Linux 

Từ thời điểm này, làm thế nào để phân biệt giữa Windows bản địa và Cygwin nên được rõ ràng mặc dù tôi không thuyết phục này là bằng chứng trong tương lai.

* số phiên bản dành cho XP và Win7 respecti vely, không dựa vào chúng

+3

Cygwin của tôi hiển thị "Windows". –

+0

@JaceBrowning: đủ công bằng, chúng tôi có thể đang sử dụng phiên bản Cygwin hoặc Python khác ... Đây là nơi lưu ý "not-futureproof" :) – sbk

+0

sự khác biệt có thể là cài đặt Python của tôi là một phần của Windows, không phải thông qua Cygwin? –

Các vấn đề liên quan