Выбрать главу

>>> 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, введенные выше в ответ на приглашение оболочки: