2010-01-27 30 views
35

Vui lòng cung thông thường để phân biệt giữa chạy Python-ứng dụng trên Windows và trên hệ điều hành khác (Linux thường) là sử dụng có điều kiện:Có an toàn khi sử dụng sys.platform == 'win32' kiểm tra trên Python 64 bit không?

if sys.platform == 'win32': 
    ... 

Nhưng tôi tự hỏi là nó an toàn để sử dụng ngày nay khi 64-bit Python là hơn được sử dụng rộng rãi trong những năm qua? Có 32 thực sự có nghĩa là 32-bit, hoặc về cơ bản nó đề cập đến Win32 API?

Nếu có khả năng có một ngày sys.platform là 'win64' có thể điều kiện như vậy sẽ phổ biến hơn?

if sys.platform.startswith('win'): 
    ... 

Ngoài ra còn có một cách khác để dò tìm Windows Tôi nhận thức được:

if os.name == 'nt': 
    ... 

Nhưng tôi thực sự chưa bao giờ thấy trong mã khác việc sử dụng sau này.

Cách tốt nhất là gì?

UPD: Tôi muốn tránh sử dụng thêm thư viện nếu có thể. Yêu cầu cài đặt thêm thư viện để kiểm tra xem tôi làm việc không có trong Windows có thể gây phiền toái cho người dùng Linux không.

+1

Đây là một câu hỏi rất hay. Cảm ơn bạn. – jathanism

Trả lời

29

sys.platform sẽ win32 không phụ thuộc vào bitness của hệ thống Windows cơ bản, như bạn có thể nhìn thấy trong PC/pyconfig.h (từ phân phối 2,6 nguồn Python):

#if defined(MS_WIN64) 
/* maintain "win32" sys.platform for backward compatibility of Python code, 
    the Win64 API should be close enough to the Win32 API to make this 
    preferable */ 
#  define PLATFORM "win32" 

Có thể tìm ra original patch mà giới thiệu này trên web, cung cấp giải thích một chút chi tiết hơn:

Câu hỏi chính là: Win64 giống Win32 nhiều hơn so với trình soạn thảo Python thông thường r phải làm cho sự khác biệt trong mã Python của mình. Hoặc, ít nhất, đủ để sự khác biệt như vậy bởi các scriptor Python là hiếm đủ rằng một số cơ chế cung cấp khác là đủ (thậm chí thích hợp hơn). Hiện tại câu trả lời là có. Hy vọng rằng MS sẽ không thay đổi câu trả lời này.

+1

Cảm ơn, đó là những gì tôi cần. – bialix

+0

Bạn được chào đón! –

1

Cảnh báo cho Windows/32 và Windows/64 là như nhau, vì vậy chúng nên sử dụng cùng một giá trị. Sự khác biệt duy nhất sẽ là, ví dụ: sys.maxintctypes. Nếu bạn cần phải phân biệt giữa 32 và 64 bất kể sau đó platform là đặt cược tốt nhất của bạn.

+0

Tôi không nhận được câu trả lời của bạn. Bạn có nói rằng xây dựng Python 64 bit bằng cách sử dụng 'win32' trong sys.platform không? Vấn đề thực sự đối với tôi là tôi không có máy 64-bit xung quanh để kiểm tra giả định này. – bialix

+0

Windows/64 xây dựng sử dụng 'win32'. (rõ ràng là các hệ điều hành 64 bit khác không) –

3

Cá nhân tôi sử dụng platinfo để phát hiện nền tảng cơ bản.

>>> from platinfo import PlatInfo 
>>> pi = PlatInfo() 
>>> pi.os 
'win64' 
>>> pi.arch 
'x64' 
>>> pi.name() 
'win64-x64' 

Đối với 32 bit, pi.name() trả về win32-x86.

+2

Tôi muốn tránh sử dụng các phụ thuộc thừa nếu tôi có thể nhận được những gì tôi cần từ vani Python. – bialix

3

Chú ý rằng bạn không thể sử dụng một trong hai sys.platform hoặc os.name cho điều này trên Jython:

$ jython -c "import sys, os; print sys.platform; print os.name" 
java1.6.0_20 
java 

Tôi nghĩ rằng có một kế hoạch trong dự án Jython thay đổi os.name báo cáo hệ điều hành cơ bản tương tự như CPython, nhưng bởi vì mọi người đang sử dụng os.name == 'java' để kiểm tra là họ trên Jython thay đổi này không thể được thực hiện qua đêm. Tuy nhiên, đã có os._name trên Jython 2.5.x:

$ jython -c "import os; print os._name" 
posix 

Cá nhân tôi có xu hướng sử dụng os.sep == '/' với mã mà cần phải chạy cả trên Jython và CPython, và cả trên Windows và các nền tảng unixy. Nó hơi xấu xí nhưng hiệu quả.

+0

Đối với IronPython 'sys.platform == 'cli''. – Gabe

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