C:\...\PP4E\System> python
>>> import sys
>>> sys.platform, sys.maxsize, sys.version
(‘win32’, 2147483647, ‘3.1.1 (r311:74483, Aug 17 2009, 17:02:12)
...дополнительные строки были удалены... ’)
>>> if sys.platform[:3] == 'win': print('hello windows')
hello windows
Если программный код должен по-разному выполняться на разных компьютерах, просто проверьте строку sys.platform, как сделано в этом примере. Несмотря на то, что Python по большей части независим от платформы, а непереносимые средства обычно заключаются в условные инструкции if, типа той, что здесь приведена, тем не менее далее, например, будет показано, что средства запуска программ и низкоуровневые взаимодействия с консолью различаются в зависимости от платформы. Поэтому проверка значения sys.platform поможет выбрать правильный инструмент для той машины, на которой выполняется сценарий.
Путь поиска модулей
Модуль sys позволяет также проверить путь поиска модулей как в интерактивном режиме, так и из программы на языке Python. Переменная sys.path хранит список строк, представляющих действительный путь поиска в выполняющемся интерпретаторе Python. Когда выполняется операция импортирования модуля, Python просматривает этот путь слева направо, пытаясь отыскать файл модуля в каждом каталоге, указанном в списке. Поэтому данная переменная позволит вам убедиться, что путь поиска действительно задан так, как нужно.7
Список sys.path просто инициализируется при первом запуске интерпретатора из PYTHONPATH с добавлением системных значений по умолчанию и содержимого файлов .pth, находящихся в каталогах со сценариями. В действительности, если заглянуть в список sys.path в интерактивной оболочке, можно обнаружить довольно много каталогов, которые отсутствуют в переменной PYTHONPATH: в него входит также указатель на домашний каталог сценария (пустая строка - назначение которой я объясню далее, после знакомства с функцией os.getcwd) и набор каталогов стандартных библиотек, который может быть различным в каждой установке:
>>> sys.path
[‘’, ‘C:\\PP4thEd\\Examples’, ...плюс каталоги стандартной библиотеки... ]
Как это ни удивительно, но список sys.path можно изменять программным способом. Сценарии могут использовать такие операции над списками, как append, extend, insert, pop и remove, а также использовать инструкцию del, чтобы изменять путь поиска модулей в процессе выполнения, чтобы подключить все каталоги с необходимыми модулями. Python всегда использует для импорта текущее значение sys.path, учитывая все внесенные вами изменения:
>>> sys.path.append(r'C:\mydir')
>>> sys.path
[‘’, ‘C:\\PP4thEd\\Examples’, ...more deleted..., ‘C:\\mydir’]
Такое непосредственное изменение переменной sys.path является альтернативой установке переменной оболочки PYTHONPATH, хотя и не самой лучшей. Изменения в sys.path сохраняются лишь до завершения процесса Python, и их нужно повторно вносить при каждом новом запуске программы или сеанса Python. Однако некоторые типы программ (например, сценарии, выполняющиеся на веб-сервере) не должны зависеть от значения PYTHONPATH. Такие сценарии могут сами настраивать список sys.path при запуске и включать в него все необходимые каталоги с импортируемыми модулями. Более конкретный пример использования sys.path приводится в примере 1.34, в предыдущей главе, где мы вынуждены были предусмотреть динамическую настройку пути поиска, так как применение веб-сервера не позволяет делать какие-либо предположения о путях к импортируемым модулям.
Пути к каталогам в Windows
Обратите внимание, что при настройке списка sys.path в примерах выше были использованы литералы необрабатываемых строк (raw string): поскольку обратный слеш в строке Python обычно означает начало экранированной последовательности, пользователи Windows должны следить за тем, чтобы удваивать символы слеша при использовании в строках с путями к каталогам (например, в строке "C:\\dir" комбинация \\ в действительности является экранированной последовательностью, означающей символ \), или использовать константы необрабатываемых строк, чтобы иметь возможность вставлять символ обратного слеша без всяких ухищрений (например, r"C:\dir").
При просмотре путей к каталогам в Windows (например, при выводе списка sys.path в интерактивной оболочке) Python выводит \\, как один символ \. Формально можно обойтись одним символом \, если за ним следует символ, не воспринимаемый Python как продолжение экранированной последовательности, но использовать удвоение и необрабатываемые строки обычно легче, чем запоминать таблицы экранированных последовательностей.