my os.getcwd => C:\...\PP4E\System
my sys.path => [‘C:\\...\\PP4E\\System’, ...more... ]
В данном случае текущий рабочий каталог, используемый для поиска файлов, и первый каталог в пути поиска модулей совпадают с каталогом, содержащим файл сценария. Обычно все действует так, как предполагается, но здесь вас могут подстерегать две опасности:
• Имена файлов должны содержать полные пути к каталогам, если заранее не известно, из какого каталога будет запущен сценарий.
• Сценарии командной строки не всегда могут использовать текущий рабочий каталог, чтобы увидеть импортируемые файлы, не находящиеся в собственных каталогах сценариев, - для доступа к модулям из других каталогов следует использовать переменную окружения PYTHONPATH и пути к импортируемым пакетам.
Например, сценарии из этой книги всегда могут импортировать другие файлы из собственного исходного каталога, не указывая путь к импортируемому пакету (import file here), независимо от того, как они запущены. Но, чтобы отыскать файлы в другом месте в дереве каталогов примеров, путь поиска должен проходить через корень пакета РР4Е (from PP4E.dir1.dir2 import filethere), даже если запускать сценарии из каталога, содержащего нужный внешний модуль. Как обычно, чтобы обеспечить возможность импортирования модулей, имя каталога PP4E\dirl\dir2 можно также добавить в PYTHONPATH, чтобы сделать file-there видимым отовсюду, без указания пути к импортируемому пакету (хотя лишние каталоги в PYTHONPATH увеличивают вероятность конфликта имен). В любом случае импорт всегда осуществляется из исходного каталога сценария или из другого каталога, находящегося в пути поиска Python, а не из текущего рабочего каталога.
Текущий рабочий каталог и командные строки
Это различие между текущим рабочим каталогом и путями поиска модулей объясняет, почему многие сценарии в данной книге, которые должны действовать в текущем рабочем каталоге (а не в том, имя которого передано), запускаются командной строкой вида:
C:\temp> python C:\...\PP4E\Tools\cleanpyc.py обработка cwd
В данном примере сам файл сценария на языке Python находится в каталоге C:\..\PP4E\Tools, но поскольку он запускается из C:\temp, то обрабатывает файлы, содержащиеся в C:\temp (то есть в текущем рабочем каталоге, а не исходном каталоге сценария). Чтобы обработать с помощью такого сценария файлы, находящиеся где-то в другом месте, нужно просто изменить текущий рабочий каталог с помощью команды cd и перейти в каталог, который должен быть обработан:
C:\temp> cd C:\PP4thEd\Examples
C:\PP4thEd\Examples> python C:\...\PP4E\Tools\cleanpyc.py обработка cwd
Поскольку текущий рабочий каталог всегда неявно определен, сценарий узнает, какой каталог должен быть обработан, от команды cd с той же степенью определенности, что и при явной передаче имени каталога сценарию, как показано ниже (примечание, касающееся переносимости: в других примерах команд вам может потребоваться заключить *.py в кавычки, чтобы предотвратить подстановку имен файлов, которая выполняется в некоторых оболочках Unix):
C:\...\PP4E\Tools> python find.py *.py C:\temp обработка указанного
каталога
В этой командной строке текущим рабочим каталогом является каталог, содержащий запускаемый сценарий, который должен быть выполнен (обратите внимание на отсутствие пути в имени файла сценария). Но поскольку этот сценарий обрабатывает каталог, явно указанный в командной строке (C:\temp), в данном случае не имеет никакого значения, какой каталог является текущим рабочим каталогом. Наконец, если потребуется выполнить такой сценарий, расположенный в некотором другом каталоге, для обработки файлов, находящихся в третьем каталоге, можно просто указать пути каталогов для обоих:
C:\temp> python C:\...\PP4E\Tools\find.py *.cxx C:\PP4thEd\Examples\PP4E
В этом случае для импорта будут доступны файлы в исходном каталоге сценария PP4E\Tools, а обрабатываться будут файлы в каталоге, указанном в командной строке, при этом текущим рабочим каталогом будет совершенно другой каталог (C:\temp). Использование последней формы требует больше вводить с клавиатуры, тем не менее в этой книге вам еще не раз встретятся различные текущие рабочие каталоги и командные строки с явными путями к сценариям.