Проделаем еще несколько экспериментов с этими системными утилитами Python, чтобы продемонстрировать другие режимы работы. Если при запуске в командной строке заданы не все аргументы, сценарии split и join достаточно сообразительны, чтобы попросить пользователя ввести параметры интерактивно. Рассмотрим снова процесс разрезания и склеивания самоустанавливающегося файла Python в Windows, когда параметры вводятся в окне консоли DOS:
C:\temp> python C:\…\PP4E\System\Filetools\split.py
File to be split? python-3.1.msi
Directory to store part files? splitout
Splitting C:\temp\python-3.1.msi to C:\temp\splitout by 1433600
Split finished: 10 parts are in C:\temp\splitout
Press Enter key
C:\temp> python C:\…\PP4E\System\Filetools\join.py
Directory containing part files? splitout
Name of file to be recreated? newpy31.msi
Joining C:\temp\splitout to make C:\temp\newpy31.msi
Join complete: see C:\temp\newpy31.msi
Press Enter key
C:\temp> fc /B python-3.1.msi newpy31.msi
Comparing files python-3.1.msi and NEWPY31.MSI FC: no differences encountered
Когда эти программы запускаются в проводнике файлов Windows двойным щелчком мыши, они действуют точно так же (при таком способе запуска они обычно не получают аргументов командной строки). В таком режиме вывод абсолютного пути помогает прояснить, где в действительности находятся файлы. Помните, что при запуске щелчком мыши на файле текущим рабочим каталогом является исходный каталог сценария, поэтому при вводе просто имени файла оно будет отнесено в каталог со сценарием. Чтобы поместить файлы фрагментов в другое место, введите полный путь:
[во всплывающем окне консоли DOS, когда split.py запущен щелчком мыши]
File to be split? c:\temp\python-3.1.msi
Directory to store part files? c:\temp\parts
Splitting c:\temp\python-3.1.msi to c:\temp\parts by 1433600
Split finished: 10 parts are in c:\temp\parts
Press Enter key
[во всплывающем окне консоли DOS, когда join.py запущен щелчком мыши] Directory containing part files? c:\temp\parts
Name of file to be recreated? c:\temp\morepy31.msi
Joining c:\temp\parts to make c:\temp\morepy31.msi
Join complete: see c:\temp\morepy31.msi
Press Enter key
Поскольку основная логика этих сценариев оформлена в виде функций, их легко можно использовать, импортировав и вызвав из другого компонента Python (убедитесь, что путь поиска модулей включает каталог, содержащий корень PP4E, — первая сокращенная строка в следующем примере демонстрирует один из способов добиться этого):
C:\temp> set PYTHONPATH=C:\…\dev\Examples
C:\temp> python
> >> from PP4E.System.Filetools.split import split
> >> from PP4E.System.Filetools.join import join
>>>
> >> numparts = split(‘python-3.1.msi’, ‘calldir’)
> >> numparts
10
> >> join(‘calldir’, ‘callpy31.msi’)
>>>
> >> import os
> >> os.system(‘fc /B python-3.1.msi callpy31.msi’)
Comparing files python-3.1.msi and CALLPY31.msi
FC: no differences encountered 0
Замечание, касающееся производительности: все приведенные здесь примеры запуска сценариев split и join обрабатывают файл размером 13 Mбайт и выполняются не более 1 секунды реального времени на моем ноутбуке, работающем под управлением Windows 7 и снабженном процессором Atom с тактовой частотой 2 Ггц, — достаточно быстро для любого мыслимого применения. Оба сценария столь же быстро справляются и с другими значениями размеров фрагментов. Ниже показано, как выполняется разрезание файла на фрагменты по 4 Мбайта и 500 Кбайт:
C:\temp> C:\…\PP4E\System\Filetools\split.py python-3.1.msi tempsplit 4000000
Splitting C:\temp\python-3.1.msi to C:\temp\tempsplit by 4000000
Split finished: 4 parts are in C:\temp\tempsplit
C:\temp> dir tempsplit
…часть строк опущена…
Directory of C:\temp\tempsplit