Варианты использования

varianty ispolzovaniya Законченные системные программы

Проделаем еще несколько экспериментов с этими системными утилитами 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

подпись: 02/21/2010 01:27 pm
02/21/2010 01:27 pm
02/21/2010 01:27 pm
02/21/2010 01:27 pm
02/21/2010 01:27 pm
02/21/2010 01:27 pm
4 file(s)
2 dir(s)
подпись: <dir> .
<dir> ..
4,000,000 part0001
4,000,000 part0002
4,000,000 part0003
1,814,272 part0004
13,814,272 bytes
188,671,983,616 bytes free



 


C:\temp> C:\\PP4E\System\Filetools\split.py python-3.1.msi tempsplit 500000

Splitting C:\temp\python-3.1.msi to C:\temp\tempsplit by 500000


Split finished: 28 parts are in C:\temp\tempsplit

C:\temp> dir tempsplit

часть строк опущена

Directory of C:\temp\tempsplit

подпись: <dir> .
<dir> ..
500,000 part0001
500,000 part0002
500,000 part0003
500,000 part0004
500,000 part0005
500,000 part0024
500,000 part0025
500,000 part0026
500,000 part0027
314,272 part0028
13,814,272 bytes 188,671,946,752 bytes free
02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

…часть строк опущена…

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

02/21/2010 01:27 PM

28 File(s)

2 Dir(s)

Разрезание может выполняться заметно дольше, если указать размеры файлов фрагментов настолько маленькими, что это приведет к созданию тысяч фрагментов, — разрезание на 1382 фрагмента выполняется медленнее (впрочем, некоторые современные компьютеры настолько быстрые, что разницу во времени можно не заметить):

C:\temp> C:\\PP4E\System\Filetools\split.py python-3.1.msi tempsplit 10000

Splitting C:\temp\python-3.1.msi to C:\temp\tempsplit by 10000

Split finished: 1382 parts are in C:\temp\tempsplit

C:\temp> C:\\PP4E\System\Filetools\join.py tempsplit manypy31.msi

Joining C:\temp\tempsplit to make C:\temp\manypy31.msi

Join complete: see C:\temp\manypy31.msi

C:\temp> fc /B python-3.1.msi manypy31.msi

Comparing files python-3.1.msi and MANYPY31.MSI FC: no differences encountered

C:\temp> dir tempsplit

часть строк опущена

Directory of C:\temp\tempsplit

02/21/2010 01:40 PM <DIR> .

02/21/2010 01:40 PM <DIR> ..

02/21/2010 01:39 PM 10,000 part0001

02/21/2010 01:39 PM 10,000 part0002

02/21/2010 01:39 PM 10,000 part0003

02/21/2010

01

:39

PM

10,000

part0004

02/21/2010

01

:39

PM

10,000

part0005

…более 1000 строк опущено…

 

02/21/2010

01

:40

PM

10,000

part1378

02/21/2010

01

:40

PM

10,000

part1379

02/21/2010

01

:40

PM

10,000

part1380

02/21/2010

01

:40

PM

10,000

part1381

02/21/2010

01

:40

PM

4,272

part1382

 

1382

File(s)

13,814,272

bytes

 

 

2

Dir(s)

188,651,008,000 bytes free

 

Наконец, сценарий split достаточно умен, чтобы создать выходной каталог, если его не существует, или очистить его от старых файлов, если он существует, — в следующем примере видно, что в выходном каталоге остались только новые файлы. Так как сценарий join объединяет все файлы, присутствующие в выходном каталоге, это полезное эргономическое дополнение. Если бы выходной каталог не очищался перед каждым запуском сценария split, можно было бы легко забыть, что в каталоге находятся файлы от предыдущего прогона. Поскольку эти сценарии предназначены для выполнения простыми пользователями, они должны быть как можно более снисходительными. Ваши пользователи могут оказаться более подготовленными (хотя вам не следует надеяться на это).

C:\temp> C:\\PP4E\System\Filetools\split.py python-3.1.msi tempsplit 5000000

Splitting C:\temp\python-3.1.msi to C:\temp\tempsplit by 5000000

Split finished: 3 parts are in C:\temp\tempsplit

C:\temp> dir tempsplit

часть строк опущена

Directory of C:\temp\tempsplit

подпись: 02/21/2010 01:47 pm
02/21/2010 01:47 pm
02/21/2010 01:47 pm
02/21/2010 01:47 pm
02/21/2010 01:47 pm
3 file(s)
2 dir(s)
подпись: <dir> .
<dir> ..
5,000,000 part0001
5,000,000 part0002
3,814,272 part0003
13,814,272 bytes
188,654,452,736 bytes free

Конечно, проблему, которую решают эти сценарии, в настоящее время легко можно решить, просто купив более емкую флешку или предоставив детям выход в Интернет. Тем не менее, как только вы решите какую-либо проблему с помощью сценариев, вы поймете, насколько простым и гибким средством является Python, снабженный мощными встроенными инструментами, особенно удобными для разработки сценариев автоматизации, таких как эти. При грамотном использовании Python может стать для вас аналогом швейцарского армейского ножа.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий