Форум сайта python.su
Чтото гугл не помог. Задача в следующем: скриптом нужно определить тип и версию операционной системы и в зависимости от того в какой операционной системе запущен скрипт, выполнить соответствующий код допустимый в данной ОС. Питон 2.6.5.
Отредактировано (Июль 9, 2010 14:59:27)
Офлайн
import sys
sys.platform
Офлайн
Спасибо.
Офлайн
from distutils.util import get_platform
Офлайн
pyuserПо-моему get_platform возвращает то же самое, что и sys.platform. При этом разрядность системы вряд ли удастся определить, т.к. даже на х64 этот метод возвращает win32, видимо, из-за того, что интерпретатор работаем в x86 режиме.если еще и разрядность системы важнаfrom distutils.util import get_platform
import platform
platform.system()
Офлайн
я использовал platform.architecture()
разрядность определяется на ура.
Для моей убунты это ('64bit', ‘ELF’)
Что было на XP и Vista - не помню, но 64bit/32bit присутствовало. Использовал это для создания платформозависимых оберток на ctypes.
sys.platform/platform.system() определяют семейство операционной системы - ‘linux2’ и ‘Linux’ в моем случае соответственно.
'win32' вносит некоторую путаницу, но это собирательное название для Microsoft Windows начиная с Windows 95 - безотносительно к архитектуре процессора, на котором исполняется код. Т.е. даже Windows Mobile на ARM покажет ‘win32’, если ничего не путаю.
Офлайн
Насчет win32 вы правы, я и не говорил, что ожидал чего-то в духе “win64”, я предпологал, что на x64 увижу что-то вроде “win32-x64”.
Кстати, модуль platform на Win7 x64 работает вот так:
>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
Отредактировано (Июль 10, 2010 17:43:48)
Офлайн
надо полагать, у вас все же 32 битный питон, работающий в Wow64.
platform.architecture возвращает архитектуру для вызвавшего его процесса.
Для винды я бы вызывал GetVersionEx/GetSystemInfo/GetNativeSystemInfo через ctypes
Офлайн
Андрей СветловТак и есть, я об этом писал выше.
надо полагать, у вас все же 32 битный питон, работающий в Wow64.
import os
if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("64" in os.getenv('PROCESSOR_ARCHITEW6432')):
print "64-bit"
else:
print "32-bit"
Отредактировано (Июль 11, 2010 02:00:58)
Офлайн
за информацию о 2.7/3.2 спасибо, не знал.
Только какое-то немного сомнительное решение.
Рассмотрим такую ситуацию: мне нужно подключать разные dll в зависимости от используемой архитектуры.
В старом подходе все было ясно. Теперь же прийдется делать какую-то другую проверку. Ведь если у меня 32 битный питон, то уже не столь важно, какая разрядность у самой винды - будут работать только 32 битные расширения и точка.
К переменным окружения отношусь несколько настороженно. При запуске дочернего процесса они, конечно, наследуются по умолчанию. Но вместе с тем запускающий процесс может установить их как душа пожелает или вообще сбросить. Получится, что ваш код имеет шанс неправильно отработать только из-за того, что криворукий программист сделал несовсем корректную заускалку. Выяснение проблемы может быть непростым, а все что вы услышите будет звучать как “программа ххх не работает, если я вызываю ее через subprocess”. Поверьте, я такое не раз видел.
Офлайн