Найти - Пользователи
Полная версия: Автоматическое определение ОС.
Начало » Python для новичков » Автоматическое определение ОС.
1 2
nauman
Чтото гугл не помог. Задача в следующем: скриптом нужно определить тип и версию операционной системы и в зависимости от того в какой операционной системе запущен скрипт, выполнить соответствующий код допустимый в данной ОС. Питон 2.6.5.
Vader
import sys
sys.platform
nauman
Спасибо.
pyuser
from distutils.util import get_platform
если еще и разрядность системы важна
Vader
pyuser
from distutils.util import get_platform
если еще и разрядность системы важна
По-моему get_platform возвращает то же самое, что и sys.platform. При этом разрядность системы вряд ли удастся определить, т.к. даже на х64 этот метод возвращает win32, видимо, из-за того, что интерпретатор работаем в x86 режиме.

Кстати, есть еще один способ:
import platform
platform.system()
В этом случае можно получить название ос без лишних подробностей, т.е. “Windows” или “Linux”.
Андрей Светлов
я использовал platform.architecture()
разрядность определяется на ура.
Для моей убунты это ('64bit', ‘ELF’)
Что было на XP и Vista - не помню, но 64bit/32bit присутствовало. Использовал это для создания платформозависимых оберток на ctypes.
sys.platform/platform.system() определяют семейство операционной системы - ‘linux2’ и ‘Linux’ в моем случае соответственно.

'win32' вносит некоторую путаницу, но это собирательное название для Microsoft Windows начиная с Windows 95 - безотносительно к архитектуре процессора, на котором исполняется код. Т.е. даже Windows Mobile на ARM покажет ‘win32’, если ничего не путаю.
Vader
Насчет win32 вы правы, я и не говорил, что ожидал чего-то в духе “win64”, я предпологал, что на x64 увижу что-то вроде “win32-x64”.
Кстати, модуль platform на Win7 x64 работает вот так:
>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
Интересно, как же все-таки разрядность винды определить…
Андрей Светлов
надо полагать, у вас все же 32 битный питон, работающий в Wow64.
platform.architecture возвращает архитектуру для вызвавшего его процесса.
Для винды я бы вызывал GetVersionEx/GetSystemInfo/GetNativeSystemInfo через ctypes
Vader
Андрей Светлов
надо полагать, у вас все же 32 битный питон, работающий в Wow64.
Так и есть, я об этом писал выше.

С помощью GetVersionExW получилось, но слегка замороченно как-то…
Я более простой метод нашел:
import os
if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("64" in os.getenv('PROCESSOR_ARCHITEW6432')):
print "64-bit"
else:
print "32-bit"
Кстати, в 2.7 platform.architecture() должен уже правильно работать http://bugs.python.org/issue7860
Андрей Светлов
за информацию о 2.7/3.2 спасибо, не знал.
Только какое-то немного сомнительное решение.
Рассмотрим такую ситуацию: мне нужно подключать разные dll в зависимости от используемой архитектуры.
В старом подходе все было ясно. Теперь же прийдется делать какую-то другую проверку. Ведь если у меня 32 битный питон, то уже не столь важно, какая разрядность у самой винды - будут работать только 32 битные расширения и точка.

К переменным окружения отношусь несколько настороженно. При запуске дочернего процесса они, конечно, наследуются по умолчанию. Но вместе с тем запускающий процесс может установить их как душа пожелает или вообще сбросить. Получится, что ваш код имеет шанс неправильно отработать только из-за того, что криворукий программист сделал несовсем корректную заускалку. Выяснение проблемы может быть непростым, а все что вы услышите будет звучать как “программа ххх не работает, если я вызываю ее через subprocess”. Поверьте, я такое не раз видел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB