Уведомления

Группа в Telegram: @pythonsu

#1 Июль 9, 2010 14:58:05

nauman
От:
Зарегистрирован: 2009-10-28
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

Чтото гугл не помог. Задача в следующем: скриптом нужно определить тип и версию операционной системы и в зависимости от того в какой операционной системе запущен скрипт, выполнить соответствующий код допустимый в данной ОС. Питон 2.6.5.



Отредактировано (Июль 9, 2010 14:59:27)

Офлайн

#2 Июль 9, 2010 15:07:30

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

import sys
sys.platform



Офлайн

#3 Июль 9, 2010 15:58:30

nauman
От:
Зарегистрирован: 2009-10-28
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

Спасибо.



Офлайн

#4 Июль 10, 2010 07:37:20

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

from distutils.util import get_platform
если еще и разрядность системы важна



Офлайн

#5 Июль 10, 2010 11:33:30

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

pyuser
from distutils.util import get_platform
если еще и разрядность системы важна
По-моему get_platform возвращает то же самое, что и sys.platform. При этом разрядность системы вряд ли удастся определить, т.к. даже на х64 этот метод возвращает win32, видимо, из-за того, что интерпретатор работаем в x86 режиме.

Кстати, есть еще один способ:
import platform
platform.system()
В этом случае можно получить название ос без лишних подробностей, т.е. “Windows” или “Linux”.



Офлайн

#6 Июль 10, 2010 15:51:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Автоматическое определение ОС.

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

'win32' вносит некоторую путаницу, но это собирательное название для Microsoft Windows начиная с Windows 95 - безотносительно к архитектуре процессора, на котором исполняется код. Т.е. даже Windows Mobile на ARM покажет ‘win32’, если ничего не путаю.



Офлайн

#7 Июль 10, 2010 17:43:08

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

Насчет win32 вы правы, я и не говорил, что ожидал чего-то в духе “win64”, я предпологал, что на x64 увижу что-то вроде “win32-x64”.
Кстати, модуль platform на Win7 x64 работает вот так:

>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
Интересно, как же все-таки разрядность винды определить…



Отредактировано (Июль 10, 2010 17:43:48)

Офлайн

#8 Июль 11, 2010 00:49:12

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Автоматическое определение ОС.

надо полагать, у вас все же 32 битный питон, работающий в Wow64.
platform.architecture возвращает архитектуру для вызвавшего его процесса.
Для винды я бы вызывал GetVersionEx/GetSystemInfo/GetNativeSystemInfo через ctypes



Офлайн

#9 Июль 11, 2010 01:57:28

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое определение ОС.

Андрей Светлов
надо полагать, у вас все же 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



Отредактировано (Июль 11, 2010 02:00:58)

Офлайн

#10 Июль 11, 2010 23:15:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Автоматическое определение ОС.

за информацию о 2.7/3.2 спасибо, не знал.
Только какое-то немного сомнительное решение.
Рассмотрим такую ситуацию: мне нужно подключать разные dll в зависимости от используемой архитектуры.
В старом подходе все было ясно. Теперь же прийдется делать какую-то другую проверку. Ведь если у меня 32 битный питон, то уже не столь важно, какая разрядность у самой винды - будут работать только 32 битные расширения и точка.

К переменным окружения отношусь несколько настороженно. При запуске дочернего процесса они, конечно, наследуются по умолчанию. Но вместе с тем запускающий процесс может установить их как душа пожелает или вообще сбросить. Получится, что ваш код имеет шанс неправильно отработать только из-за того, что криворукий программист сделал несовсем корректную заускалку. Выяснение проблемы может быть непростым, а все что вы услышите будет звучать как “программа ххх не работает, если я вызываю ее через subprocess”. Поверьте, я такое не раз видел.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version