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

ет код файла в том же процессе, генерируя объект модуля. При этом никакие другие программы не запускаются.8

Могут быть веские основания для построения системы в виде отдельных программ, и в следующей главе будут рассмотрены такие темы, как аргументы командной строки и потоки ввода-вывода, которые позволяют программам передавать информацию в обоих направлениях. Но в большинстве случаев операция импортирования является более быстрым и прямым способом построения систем.

Если вы серьезно намерены использовать эти вызовы, то следует знать, что вызов os.system обычно блокирует (то есть приостанавливает) вызывающую программу до завершения запущенной ею команды. В Linux и Unix-подобных платформах имеется возможность заставить команду выполняться независимо и параллельно с вызвавшей ее программой, добавив в конец командной строки оператор & выполнения в фоновом режиме:

os.system("python program.py arg arg &”)

В Windows запуск с помощью команды DOS start обычно также приводит к запуску команды в виде независимого процесса, выполняющегося параллельно:

os.system("start program.py arg arg”)

В действительности, такой способ запуска команд оказался настолько удобным, что в последние версии Python была добавлена функция os.startfile. Эта функция открывает файл с помощью программы, указанной в реестре Windows для файлов этого типа, как если бы был выполнен щелчок мышью на ярлыке этого файла:

os.startfile("webpage.html”) # open file in your web browser os.startfile("document.doc”) # open file in Microsoft Word os.startfile("myscript.py”) # run file with Python

Функция os.popen обычно не блокирует вызывающую программу (она, по определению, должна иметь возможность читать или писать в возвращаемый объект файла). Тем не менее вызывающая программа иногда все же может оказаться заблокированной в любой операционной системе, Windows или Linux, если объект канала будет закрыт до завершения порожденной программы (например, при сборке мусора) или когда канал будет прочитан до исчерпания (например, с помощью метода read() канала). Как будет показано далее в этой части книги, для параллельного исполнения программ без блокирования можно использовать функции os.fork/exec в Unix и os.spawnv - в Windows.

Поскольку функции system и popen из модуля os, а также модуль subprocess попадают еще и в категорию средств запуска программ, перенаправления потоков ввода-вывода и средств взаимодействия процессов, они снова появятся в последующих главах, поэтому пока мы отложим их дальнейшее обсуждение. Если вам уже сейчас необходимы дополнительные подробности, прочитайте раздел, касающийся вопросов перенаправления потоков ввода-вывода в следующей главе, и раздел, описывающий получение списка каталогов, в главе 4.

Другие элементы, экспортируемые модулем os

Мы рассмотрели в модуле os, что смогли. Поскольку все другие инструменты модуля os еще труднее оценить вне контекста более крупных приложений, мы отложим их более пристальное рассмотрение до последующих разделов. Но, чтобы дать вам представление о характере этого модуля, ниже приводится краткий справочный обзор. Среди прочего на вооружении модуля os состоят:

os.environ

Извлекает и устанавливает значения переменных окружения оболочки.

os.fork

Запускает новый дочерний процесс в Unix-подобных системах.

os.pipe

Обеспечивает обмен данными между программами.

os.execlp

Запускает новые программы.

os.spawnv

Запускает новые программы с возможностью низкоуровневого управления.

os.open

Открывает файл с использованием файлового дескриптора.

os.mkdir

Создает новый каталог.

os.mkfifo

Создает новый именованный канал.

os.stat

Получает низкоуровневую информацию о файле.

os.remove

Удаляет файл по строке пути к нему.

os.walk

Применяет функцию или тело цикла ко всем элементам в дереве каталогов.

И так далее. Заранее предупреждаю: модуль os предоставляет группу функций для открытия, чтения и записи файлов, но все они используют доступ к файлам на низком уровне и кардинально отличаются от встроенных файловых объектов Python stdio, создаваемых с помощью встроенной функции open. Обычно во всех случаях следует использовать встроенную функцию open, а не модуль os, кроме очень специфических потребностей обработки файлов (например, когда требуется открыть файл, заблокировав доступ к нему из других программ).