nauman
Июль 9, 2010 14:58:05
Чтото гугл не помог. Задача в следующем: скриптом нужно определить тип и версию операционной системы и в зависимости от того в какой операционной системе запущен скрипт, выполнить соответствующий код допустимый в данной ОС. Питон 2.6.5.
Vader
Июль 9, 2010 15:07:30
nauman
Июль 9, 2010 15:58:30
Спасибо.
pyuser
Июль 10, 2010 07:37:20
from distutils.util import get_platform
если еще и разрядность системы важна
Vader
Июль 10, 2010 11:33:30
pyuser
from distutils.util import get_platform
если еще и разрядность системы важна
По-моему get_platform возвращает то же самое, что и sys.platform. При этом разрядность системы вряд ли удастся определить, т.к. даже на х64 этот метод возвращает win32, видимо, из-за того, что интерпретатор работаем в x86 режиме.
Кстати, есть еще один способ:
import platform
platform.system()
В этом случае можно получить название ос без лишних подробностей, т.е. “Windows” или “Linux”.
Андрей Светлов
Июль 10, 2010 15:51:56
я использовал 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
Июль 10, 2010 17:43:08
Насчет win32 вы правы, я и не говорил, что ожидал чего-то в духе “win64”, я предпологал, что на x64 увижу что-то вроде “win32-x64”.
Кстати, модуль platform на Win7 x64 работает вот так:
>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
Интересно, как же все-таки разрядность винды определить…
Андрей Светлов
Июль 11, 2010 00:49:12
надо полагать, у вас все же 32 битный питон, работающий в Wow64.
platform.architecture возвращает архитектуру для вызвавшего его процесса.
Для винды я бы вызывал GetVersionEx/GetSystemInfo/GetNativeSystemInfo через ctypes
Vader
Июль 11, 2010 01:57:28
Андрей Светлов
надо полагать, у вас все же 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 23:15:58
за информацию о 2.7/3.2 спасибо, не знал.
Только какое-то немного сомнительное решение.
Рассмотрим такую ситуацию: мне нужно подключать разные dll в зависимости от используемой архитектуры.
В старом подходе все было ясно. Теперь же прийдется делать какую-то другую проверку. Ведь если у меня 32 битный питон, то уже не столь важно, какая разрядность у самой винды - будут работать только 32 битные расширения и точка.
К переменным окружения отношусь несколько настороженно. При запуске дочернего процесса они, конечно, наследуются по умолчанию. Но вместе с тем запускающий процесс может установить их как душа пожелает или вообще сбросить. Получится, что ваш код имеет шанс неправильно отработать только из-за того, что криворукий программист сделал несовсем корректную заускалку. Выяснение проблемы может быть непростым, а все что вы услышите будет звучать как “программа ххх не работает, если я вызываю ее через subprocess”. Поверьте, я такое не раз видел.