>>> os.path.join(*pathname.split(os.sep))
‘C:PP4thEd\\Examples\\PP4E\\PyDemos.pyw’
Последний вызов join требует передачи отдельных аргументов (отсюда и символ *), но он не вставляет первый символ слеша после буквы, обозначающей имя диска в Windows. Если подобные отличия имеют большое значение, используйте предшествующий вызов метода str. join. Функция normpath может пригодиться в ситуациях, когда в путях произвольно смешиваются разделители компонентов пути для Unix и Windows:
>>> mixed
‘C:\\temp\\public/files/index.html’
>>> os.path.normpath(mixed)
‘C:\\temp\\public\\files\\index.html’
>>> print(os.path.normpath(r'C:\temp\\sub\.\file.ext'))
C:\temp\sub\file.ext
В этом модуле имеется также функция abspath, которая переносимым образом возвращает полное имя файла. Она учитывает добавленный текущий каталог, родительский каталог .. и многое другое:
>>> os.chdir(r'C:\Users')
>>> os.getcwd()
‘C:\\Users’
>>> os.path.abspath('') # пустая строка означает тек. раб. каталог (cwd) ‘C:\\Users’
>>> os.path.abspath('temp') # расширяет до полного пути к файлу в тек. кат. ‘C:\\Users\\temp’
>>> os.path.abspath(r'PP4E\dev') # частичный путь относительно тек. раб. кат. ‘C:\\Users\\PP4E\\dev’
>>> os.path.abspath('.') # расширяет относительные пути ‘C:\\Users’
>>> os.path.abspath('..')
‘C:\\’ >>> os.path.abspath(r'..\examples')
‘C:\\examples’
>>> os.path.abspath(r'C:\PP4thEd\chapters') # абсолютные пути не изменяются ‘C:\\PP4thEd\\chapters’
>>> os.path.abspath(r'C:\temp\spam.txt')
‘C:\YtempY\spam.txt’
Поскольку имена файлов считаются относящимися к текущему рабочему каталогу, если не заданы полными путями, функция os.path.ab-spath может пригодиться, если потребуется показать пользователю, какой каталог используется в действительности для сохранения файла. В Windows, например, при запуске программ с графическим интерфейсом щелчком на ярлыках в проводнике или на рабочем столе рабочим каталогом программы является тот, в котором находится запускаемый файл, что не всегда очевидно пользователю. В таких случаях может помочь вывод значения, возвращаемого функцией abspath для файла.
Выполнение команд оболочки из сценариев
Модуль os позволяет также выполнять команды оболочки из сценариев Python. Это понятие переплетается с другими, такими как потоки ввода-вывода, которые не будут освещаться в полной мере до следующей главы, но, поскольку это одно из ключевых понятий, которое будет использоваться на протяжении всей данной части книги, бегло коснемся основ. В модуле os имеются две функции, позволяющие запустить из сценария любую команду, которую можно ввести в окне консоли:
os.system
Запускает команду оболочки из сценария Python
os.popen
Запускает команду оболочки и соединяется с ее потоками ввода или вывода
Кроме того, существует относительно новый модуль subprocess, обеспечивающий более точное управление запускаемыми командами оболочки через потоки ввода-вывода, который может использоваться как альтернатива и даже для реализации двух функций, представленных выше (хотя и за счет некоторой сложности программного кода).
Что такое команда оболочки?
Чтобы понять область действия этих вызовов, нужно сначала ввести несколько терминов. В данной книге под термином оболочка (shell) подразумевается система, которая считывает и выполняет командные строки на вашем компьютере, а под командой оболочки (shell command) подразумевается командная строка, которую вы обычно вводите в ответ на приглашение оболочки.
В Windows, например, можно открыть окно консоли MS-DOS (она же Командная строка (Command Prompt)) и вводить в нем команды DOS, такие как dir для получения списка каталогов, type для просмотра файла, имена программ, которые нужно запустить, и так далее. DOS является системной оболочкой, а команды, такие как dir и type, - командами оболочки. В Linux и Mac OS X можно запустить новый сеанс оболочки, открыв окно терминала, и также вводить в него команды оболочки - ls для вывода списка каталогов, cat для просмотра файлов и так далее. Для Unix существует множество оболочек (например, csh, ksh), но все они читают и выполняют командные строки. Ниже показаны две команды оболочки, введенные и выполненные в окне консоли MS-DOS под Windows:
C:\...\PP4E\System> dir /B ...ввод команды оболочки helloshell.py ...далее следует вывод этой команды
more.py ...DOS играет роль оболочки в Windows
more.pyc spam.txt __init__.py
C:\...\PP4E\System> type helloshell.py
# a Python program print(‘The Meaning of Life’)
Выполнение команд оболочки
Конечно, все это не имеет прямого отношения к Python (несмотря на то, что сценарии командной строки на языке Python иногда ошибочно называют инструментами оболочки). Но, поскольку функции system и popen из модуля os позволяют сценариям Python выполнять любые команды, понятные оболочке системы, мы можем использовать в своих сценариях любые имеющиеся в системе инструменты командной строки, независимо от того, написаны они на Python или нет. Например, ниже приводится некоторый программный код на языке Python, который выполняет две команды оболочки DOS, введенные выше в ответ на приглашение оболочки: