Ticket #1: ftputil_ru_utf8.txt

File ftputil_ru_utf8.txt, 40.0 kB (added by schwa, 3 years ago)

original reStructuredText file converted to UTF-8

Line 
1 ``ftputil`` - высокоуровневая библиотека для клиента FTP протокола
2 ==================================================================
3
4 :Версия:                   2.0.4
5 :Дата:                     2005-06-09
6 :Резюме:                   высокоуровневая Python библиотека для клиента FTP протокола
7 :Ключевые слова:           FTP, замена ``ftplib``, виртуальная файловая система
8 :Автор:                    Stefan Schwarzer <sschwarzer@sschwarzer.net>
9 :Перевод на русский язык:  Степанов Антон <antymail@mail.ru>
10
11 .. contents:: Содержание
12
13 Введение
14 --------
15
16 Модуль ``ftputil`` является высокоуровневым интерфейсом для
17 ftplib_ модуля.Объекты FTPHost позволяют производить
18 большое количество операций, аналогичных операциям в модулях os_ и `os.path`_.
19
20 .. _ftplib: http://www.python.org/doc/current/lib/module-ftplib.html
21 .. _os: http://www.python.org/doc/current/lib/module-os.html
22 .. _`os.path`: http://www.python.org/doc/current/lib/module-os.path.html
23
24 Примеры:
25   ::
26
27     import ftputil
28
29     # download some files from the login directory
30     host = ftputil.FTPHost('ftp.domain.com', 'user', 'password')
31     names = host.listdir(host.curdir)
32     for name in names:
33         if host.path.isfile(name):
34             host.download(name, name, 'b')  # remote, local, binary mode
35
36     # make a new directory and copy a remote file into it
37     host.mkdir('newdir')
38     source = host.file('index.html', 'r')  # file-like object
39     target = host.file('newdir/index.html', 'w')  # file-like object
40     host.copyfileobj(source, target)  # similar to shutil.copyfileobj
41     source.close()
42     target.close()
43
44 Такие методы как `FTPHost.lstat`_ и `FTPHost.stat`_ позволяют узнать размер
45 и время изменения файла. Последний может следовать по ссылкам аналогичным
46 `os.stat`_. Даже, такая функция как `FTPHost.path.walk`_ работает
47 в этой библиотеке.
48
49 .. _`os.stat`: http://www.python.org/doc/current/lib/os-file-dir.html#l2h-1455
50
51 Дистрибутив содержит модуль ``UserTuple``, который обеспечивает
52 совместимость результатов модуля stat_ с версиями Python 2.0 и 2.1.
53
54 .. _stat: http://www.python.org/doc/current/lib/module-stat.html
55
56 Иерархия исключений
57 -------------------
58
59 Исключения находятся в пространстве имен пакета ``ftputil``
60 (например: ``ftputil.TemporaryError``). Они организованы следующим образом
61
62   ::
63
64     FTPError
65         FTPOSError(FTPError, OSError)
66             TemporaryError(FTPOSError)
67             PermanentError(FTPOSError)
68             ParserError(FTPOSError)
69         FTPIOError(FTPError)
70         InternalError(FTPError)
71             RootDirError(InternalError)
72             InaccessibleLoginDirError(InternalError)
73         TimeShiftError(FTPError)
74
75 ниже приведено описание каждого исключения:
76
77 - ``FTPError``
78
79   является корнем иерархии исключений модуля.
80
81
82 - ``FTPOSError``
83
84   потомок ``OSError``. Создан для подобия объектов модуля
85   os и объектов модуля ``FTPHost``. Сравните
86
87   ::
88
89     try:
90         os.chdir('nonexisting_directory')
91     except OSError:
92         ...
93
94   с
95
96   ::
97
98     host = ftputil.FTPHost('host', 'user', 'password')
99     try:
100         host.chdir('nonexisting_directory')
101     except OSError:
102         ...
103
104   Представим функцию,
105
106
107   ::
108
109     def func(path, file):
110         ...
111
112   которая работает в локальной файловой системе и получает  ошибки
113   ``OSErrors``.  Если вы измените список параметров на
114
115   ::
116
117     def func(path, file, os=os):
118         ...
119
120   где параметр ``os`` означает ``os`` модуль, то вызывая функцию
121   как
122
123   ::
124
125     host = ftputil.FTPHost('host', 'user', 'password')
126     func(path, file, os=host)
127
128   Вы сможете использовать тот же самый код как для локальной
129   файловой системы так и для удаленной.
130   Другое подобие между ``OSError`` и ``FTPOSError`` залючается в том,
131   что последний возвращает FTP серверу код ошибки ``errno`` в
132   свойстве объекта-исключения и текст ошибки ``strerror``.
133
134 - ``TemporaryError``
135
136   это исключение вызывается в том случае, если код ошибки
137   полученной от FTP сервера находится в диапазоне от 400 до 499. Это
138   исключение соответствует исключению ``ftplib.error_temp`` (хотя
139   ``TemporaryError`` и ``ftplib.error_temp`` *не являются* идентичными).
140
141 - ``PermanentError``
142
143
144   это исключение вызывается в том случае, если код ошибки
145   полученной от FTP сервера находится в диапазоне от 500 до 599
146   (снова, это исключение подобно, но *не* идентично исключению
147   ``ftplib.error_perm``).
148
149 - ``ParserError``
150
151   ошибка, которая возникает в течение анализа списка каталогов
152   из сервера. Это исключение используется такими методами объекта
153   ``FTPHost`` как: ``stat``, ``lstat``, и ``listdir``.
154
155 - ``FTPIOError``
156
157   это исключение обозначает ошибку ввода/вывода на удаленном
158   компьютере. Эта ошибка, главным образом, связана с файл-подобными
159   объектами которые были использованы при вызове функции
160   ``FTPHost.file`` (``FTPHost.open`` - псевдоним). Сравните:
161
162   ::
163
164     >>> try:
165     ...     f = open('notthere')
166     ... except IOError, obj:
167     ...     print obj.errno
168     ...     print obj.strerror
169     ...
170     2
171     No such file or directory
172
173   с
174
175   ::
176
177     >>> host = ftputil.FTPHost('host', 'user', 'password')
178     >>> try:
179     ...     f = host.open('notthere')
180     ... except IOError, obj:
181     ...     print obj.errno
182     ...     print obj.strerror
183     ...
184     550
185     550 notthere: No such file or directory.
186
187   Как вы можете видеть, отрывки кода подобны. (Однако,
188   коды ошибок не являются одинаковыми.)
189
190 - ``InternalError``
191
192   относится к классу исключений которое вызывается из-за наличия
193   ограничений FTP протокола или в следствие непосредственного выполнения модуля
194   ``ftputil``.
195
196 - ``RootDirError``
197
198   при выполнении ``lstat`` - метода невозможно выполнить
199   ``stat``- запрос к корневому каталогу /.
200   Если Вы знаете *способ* как это сделать, пожайлуста, сообщите
201   мне. :-)
202
203 - ``InaccessibleLoginDirError``
204
205   Это исключение вызывается только в том случае, если выполнятся
206   *одно* из следующих условий:
207
208   - Каталог, в который «Вы» помещаетесь при входе в систему не
209     доступен, тогда запрос ``chdir`` будет прерван.
210
211   - Ваш путь содержит одни пробелы.
212
213 - ``TimeShiftError``
214   используется, чтобы обозначить ошибки, которые касаются метода
215   `time shift`_, например, попытка установить значение, которое не является
216   кратным 1 часу
217
218
219 ``FTPHost`` - объекты
220 ---------------------
221
222 .. _`FTPHost construction`:
223
224 Конструкция
225 ~~~~~~~~~~~
226
227 ``FTPHost`` запрос может быть произведен с использованием следующего вызова:
228
229   ::
230
231     host = ftputil.FTPHost(host, user, password, account,
232                            session_factory=ftplib.FTP)
233
234 Первые четыре параметра - строки с тем же самым значением,
235 что и у FTP класса в ``ftplib`` модуле. Параметр
236 ``session_factory`` may используется для того, чтобы произвести FTP
237 подключение через другие фабрики, чем установленное по умолчанию значение
238 ``ftplib.FTP``. Например, M2Crypto распределение использует безопасный FTP
239 класс, который получен из ``ftplib.FTP``.
240
241 Фактически, все позиционные и ключевые аргументы отличные от
242 ``session_factory`` проходят на фабрику, чтобы выполнить новый
243 фоновый сеанс (который выполняется для каждого открытого удаленного файла;
244 см. ниже).
245
246 Эти функциональные возможности конструктора также позволяют "оборачивать"
247 ``ftplib.FTP`` объекты, чтобы делать то, что невозможно сделать
248 с использованием одного ``ftplib.FTP`` конструктора.
249
250 Например, предположите, что Вы хотите произвести соединение с другим портом,
251 отличным от заданного по умолчанию, но ``ftplib.FTP`` предлагает это сделать
252 только с использованием метода ``connect``, но через другой конструктор.
253 Решение состоит в создании "класса обертки":
254
255   ::
256
257     import ftplib
258     import ftputil
259
260     EXAMPLE_PORT = 50001
261
262     class MySession(ftplib.FTP):
263         def __init__(self, host, userid, password, port):
264             """Act like ftplib.FTP's constructor but connect to other port."""
265             ftplib.FTP.__init__(self)
266             self.connect(host, port)
267             self.login(userid, password)
268
269     # try not to use MySession() as factory, - use the class itself
270     host = ftputil.FTPHost(host, userid, password,
271                            port=EXAMPLE_PORT, session_factory=MySession)
272     # use `host` as usual
273
274 При входе в систему, формат списка каталогов (необходимый для
275 применения stat - методов к файлам и каталогам) определяется
276 автоматически. Если нет, то Вы можете использовать метод
277 `set_directory_format`_ , чтобы установить формат "вручную".
278
279 ``FTPHost`` - свойства и методы
280 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
281
282 Свойства
283 ,,,,,,,,
284
285 - ``curdir``, ``pardir``, ``sep``
286
287   являются строками, которые обозначают текущий и родительский каталог на
288   на отдаленном сервере. Sep опознает разделитель пути. Хотя
289   `RFC 959`_ (Протокол передачи файлов) обращает внимание на то, что эти
290   значения могут зависеть от сервера. Unix машины , кажется, хорошо работают
291   даже для не - Unix серверов.
292
293 .. _`RFC 959`: `RFC 959 - File Transfer Protocol (FTP)`_
294
295 .. _`time shift`:
296
297 Коррекция времени часового пояса
298 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
299
300 .. _`set_time_shift`:
301
302 - ``set_time_shift(time_shift)``
303
304   устанавливает так называемое значение сдвига времени (измеряемое в секундах).
305   Сдвиг времени - различие между местным временем сервера и
306   местным временем клиента в данный момент, т.е. по определению:
307
308   ::
309
310     time_shift = server_time - client_time
311
312   Установка этого значения важна, если `upload_if_newer`_ и
313   `download_if_newer`_ работали правильно, даже если часовой пояс
314   FTP сервера отличается от часового пояса клиента (где
315   библиотека ``ftputil`` запущена). Обратите внимание на то, что значение
316   сдвига времени *может быть* отрицательным.
317
318   Если значение сдвига времени является неправльным, например не является кратным 1 часу,
319   или абсолютное зачение больше чем 24 часа, то вызывется исключение: ``TimeShiftError``.
320
321   См. также `synchronize_times`_ как простой способ установки сдвига времени.
322
323 - ``time_shift()``
324
325   возвращает установленное текущее значение сдвига времени. См.
326   ``set_time_shift`` (выше) для его определения.
327
328 .. _`synchronize_times`:
329
330 - ``synchronize_times()``
331
332   синхронизирует локальное время сервера и клиента, так,
333   чтобы методы `upload_if_newer`_ и `download_if_newer`_ правильно работали,
334   даже если клиент и сервер находятся в различных часовых поясах. Для
335   того, чтобы *все* это работало должны выполняться следующие условия:
336
337   - Должно быть установлено подключение между сервером и клиентом.
338
339   - Клиент должен иметь доступ к каталогу, который является текущим, когда
340     ``synchronize_times`` вызывается.
341
342   - Каталог, к которому обращаются *не* должен быть корневым каталогом (т.е. /)
343     FTP сервера.
344
345   Если Вы не можете выполнить эти условия, Вы можете установить
346   значение сдвига времени вручную с использованием `set_time_shift`_. Попытка вызова
347   ``synchronize_times``, если вышеупомянутые условия не выполняются приведет к генерации
348   ``TimeShiftError`` исключения.
349
350 Файлы и каталоги
351 ,,,,,,,,,,,,,,,,
352
353 - ``file(path, mode='r')``
354
355   возвращает файл-подобный объект, который связан с путем на отдаленном
356   главном компьютере. Этот путь может быть абсолютным, или относительным
357   для текущего каталога на отдаленном главном компьютере (этот каталог может быть определен
358   с помощью getcwd метода). Также как и для локальных файлов задается по умолчанию режим - "r",
359   т. е. чтение текстовых файлов. Допустимые режимы - "r",
360   "rb", "w", и "wb".
361
362 - ``open(path, mode='r')``
363
364   является псевдонимом для ``file`` (см. выше).
365
366 - ``copyfileobj(source, target, length=64*1024)``
367
368   копирует содержимое из файл-подобного объекта-источника
369   в файл-подобный объект-адресат. Единственное различие с
370   ``shutil.copyfileobj`` - есть заданный по умолчанию размер буфера.
371
372 - ``close()``
373
374   закрывает соединение с отдаленным компьютером. После этого,
375   взаимодействие с FTP сервером невозможно без создания нового объекта
376   ``FTPHost``.
377
378 - ``getcwd()``
379
380   возвращает абсолютный путь текущего каталога на отдаленном компьютере. Этот
381   метод действует подобно методу ``os.getcwd``.
382
383 - ``chdir(directory)``
384
385   устанавливает текущий каталог на FTP сервере. Это метод похож на метод
386   ``os.chdir``, а Вы что ожидали.:-)
387
388 - ``mkdir(path, [mode])``
389
390   создаёт каталог на отдаленном компьютере. При своём выполнении,
391   не создает  "промежуточные" каталоги, которые уже существуют.
392   При этом параметр ``mode`` игнорируется. Создан
393   для совместимости с ``os.mkdir``,если объект ``FTPHost``
394   вставляется в функцию вместо os модуля (см. подраздел
395   исключений Питона выше).
396
397 - ``rmdir(path)``
398
399   удаляет заданный удаленный каталог.
400
401   В предыдущих версиях ``ftputil``, эта функция зависела от отдаленного
402   сервера, были эти каталоги пустыми или нет. ``ftputil``
403   версии 2.0 по умолчанию позволяет удалять только пустые
404   каталоги.
405
406   Если Вы хотите установить ``ftputil`` 2.0, но при этом произвести
407   минимальные изменения в исходном тексте, добавьте дполнительный параметр
408   ``_remove_only_empty=False``. Обратите внимание, что это метод осуждается и,
409   вероятно, не будет поддерживаться в следующих версиях ``ftputil``.
410
411 - ``remove(path)``
412
413   удаляет файл на отдаленном компьютере (подобен методу ``os.remove``).
414
415 - ``unlink(path)``
416
417   является псевдонимом для ``remove``.
418
419 - ``rename(source, target)``
420
421   переименовывает исходный файл (или каталог) на FTP сервере.
422
423
424 - ``listdir(path)``
425
426   возвращает список, содержащий имена файлов и каталогов
427   по заданном пути; подобен методу ``os.listdir``.
428
429 Отправка и загрузка файлов
430 ,,,,,,,,,,,,,,,,,,,,,,,,,,
431
432 - ``upload(source, target, mode='')``
433
434   копирует локальный файл (с заданным именем, например, в виде строки)
435   на отдаленный компьютер по соответствующему адресу. Как источник, так и адресат
436   могут иметь абсолютные или относительные пути текущего каталога
437   (на локальном или отдаленного компьютере, соответственно).
438   Режим отправки может быть " " или "@" для ASCII, или "b" для двоичного кода.
439   Режим ASCII задан по умолчанию.
440
441 - ``download(source, target, mode='')``
442
443   выполняет загрузку из удаленного источника в конечный файл.
444   И источник и адресат являются параметрами задаваемыми в виде строки.
445   Дополнительное описание применения метода загрузки см. ниже
446
447 .. _`upload_if_newer`:
448
449 - ``upload_if_newer(source, target, mode='')``
450
451   подобен методу копирования. Единственное отличие - то,
452   что файл отправляется, если время последней модификации
453   для исходного файла более современное чем конечного файла,
454   или адресат не существует вообще. Если отправка фактически происходит,
455   то возвращается истинное значение, иначе - ложь.
456
457   Обратите внимание, что этот метод только проверяет существование и/или
458   время модификации источника и конечного файла;
459   что не может привести замене в режиме передачи, например:
460
461   ::
462
463     # transfer in ASCII mode
464     host.upload_if_newer('source_file', 'target_file', 'a')
465     # won't transfer the file again
466     host.upload_if_newer('source_file', 'target_file', 'b')
467
468   точно так же, если передача прервана, а
469   отдаленный файл будет иметь более новую модификацию
470   чем локальный файл, то передача не будет повторена,
471   даже если будет использоваться ``upload_if_newer`` второй раз.
472   Имеются (по крайней мере) две возможности после того, как отправка завершилась неудачей:
473
474   - используйте ``upload`` вместо ``upload_if_newer``, или
475
476   - удалите конечный файл используя ``FTPHost.remove``,
477     затем используте ``upload`` или ``upload_if_newer``, чтобы передать файл снова.
478
479   Если кажется, что файл отправлен "напрасно", то читайте подраздел настройки
480   `time shift`_.
481
482 .. _`download_if_newer`:
483
484 - ``download_if_newer(source, target, mode='')``
485
486   соответствует ``upload_if_newer``, но выполняет загрузку
487   с сервера на локальный компьютер. Читайте описание процесса загрузки
488   с использованием метода ``upload_if_newer``  для того, чтобы узнать больше.
489   Если загрузка фактически произошла, то возвращается истинное значение, иначе - ложь.
490
491   Если кажется, что файл отправлен напрасно, то читайте подраздел настройки
492   `time shift`_.
493
494
495 Stat - методы для файлов и каталогов
496 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
497
498 Методы ``lstat`` и ``stat`` (и другие) основываются
499 на формате  каталога, используемого FTP сервером. При соединении
500 с  компьютером, конструктор  ``FTPHost`` выбирает  формат, который, как он считает,
501 является правильным. Однако, если Вы получите странные результаты
502 (или исключения), следует установить формат каталога
503 "вручную". Установка форамата произойдет незамедлительно после вызова функции:
504
505 .. _`set_directory_format`:
506
507 - ``set_directory_format(server_format)``
508
509   ``server_format`` - представляет собой строку "unix", либо -  "ms". Чтобы
510    выбрать правильный формат, Вы должны запустить из командной строки FTP клиент
511    и вызвать функцию  листинга каталога (большинство клиентов выполняют данную
512    операцию с использованием команды ``DIR``).
513
514   Если результирующие строки  имеют вид:
515
516   ::
517
518       drwxr-sr-x   2 45854    200           512 Jul 30 17:14 image
519       -rw-r--r--   1 45854    200          4604 Jan 19 23:11 index.html
520
521   используйте строку "unix" как аргумент.
522
523   Если вывод имеет вид таких строк:
524
525   ::
526
527       12-07-01  02:05PM       <DIR>          XPLaunch
528       07-17-00  02:08PM             12266720 digidash.exe
529
530   тогда используте "ms" для установки значения ``server_format``.
531
532   Если ни один из вышеупомянутых параметров настройки не поможет,
533   тогда свяжитесь со мной. Был бы очень хорошо, если Вы смогли бы  выслать
534   листинг ошибочного вывода (вывод с использованием команды ``DIR``).
535
536 Если, при запросе, ``lstat`` или ``stat`` методы выдают неправильное время изменения файла,
537 или  неправильно выдают дату, используйте методы, которые работают с учётом разницы во времени
538 (`time shift`_).
539
540 .. _`FTPHost.lstat`:
541
542 - ``lstat(path)``
543
544   возвращает объект, аналогичный объекту ``os.lstat`` (кортеж с
545   дополнительными параметрами;  смотрите документацию по  ``os``
546   модулю). Однако, учитывая характер приложения,
547   следует обратить внимание на следующие аспекты:
548
549   - Результат получается вследствие анализа вывода команды ``DIR``
550     на сервере. Поэтому, результат команды  ``FTPHost.lstat`` не
551     может содержать больше информации чем полученный текст.
552     В особенности:
553
554   - Пользователь и группа пользователей могут  быть определены толоко через строки, но не
555     как числа, и только  сервер выдает эти строки. Это
556     Это обычно относится к самим  Unix серверами, но никак не относится к
557     FTP программам сервера.
558
559   - Значения  времени последней модификации  файла могут быть неточными,
560     все зависит от информации полученной от сервера. Если файл
561     был изменен раньше чем год назад , то точность значения времени
562     изменения файла не будет больше одного дня. Для более новых
563     файлов, точность времени модификации файла  может  быть равной одной минуте.
564
565   - Ссылки могут  быть явными только на тех серверах,
566     которые получают информацию из вывода команды ``DIR``.
567
568   - Пункты, которые не могут быть определены принимают значение ``None``.
569
570   - Также существует  проблема с применением stat - метода к корневому каталогу. В
571     этом случае вызывается ошибка ``RootDirError``. Проблема имеет отношение к
572     алгоритму, используемому в методе ``(l)stat``, и я не знаю ни одного способа, который
573     помог бы её решить.
574
575 .. update for other servers
576
577 ..
578
579   В настоящее время, библиотека ``ftputil`` поддерживает формат MS Robin FTP сервера.
580   Формат который в основном используется Unix серверами также поддерживается. Если
581   Вы нуждаетесь в поддержке других форматов, пожалуйста, свяжитесь со мной
582   по электронной почте. Адрес приведён в конце этого текста.
583
584 .. implement and document support for setting the directory parser
585    "manually"
586
587 .. _`FTPHost.stat`:
588
589 - ``stat(path)``
590   возвращает ``stat`` информацию для файлов, которые указаны по ссылке.
591   Этот метод следует по множеству ссылок, пока регулярный файл или каталог
592   не будут найдены. Если цепочка ссылок зациклена то вызывается исключение:
593   ``PermanentError``.
594
595 ``FTPHost.path``
596 ~~~~~~~~~~~~~~~~
597
598 ``FTPHost`` объекты имеют такое свойство как: ``path``, подобное
599 `os.path`_. Приведенные ниже методы могут прменяться
600 к отдаленному компьютеру с семантикой кода аналогичной семантике кода методов ``os.path``:
601
602 .. _`FTPHost.path.walk`:
603
604 ::
605
606     abspath(path)
607     basename(path)
608     commonprefix(path_list)
609     dirname(path)
610     exists(path)
611     getmtime(path)
612     getsize(path)
613     isabs(path)
614     isdir(path)
615     isfile(path)
616     islink(path)
617     join(path1, path2, ...)
618     normcase(path)
619     normpath(path)
620     split(path)
621     splitdrive(path)
622     splitext(path)
623     walk(path, func, arg)
624
625 ``FTPFile`` - объекты
626 ---------------------
627
628 ``FTPFile`` объекты создаются при вызове конструкций ``FTPHost.file`` (или
629 ``FTPHost.open``) и имеют аналогичные методы, (с теми же параметрами, и с той же семантикой)
630 что и методы, работающие с локальными файлами:
631
632   ::
633
634     close()
635     read([count])
636     readline([count])
637     readlines()
638     write(data)
639     writelines(string_sequence)
640     xreadlines()
641
642 и атрибут ``closed``. Для получения детальной информации смотрите раздел  `File
643 objects`_ в справочнике по библиотеке.
644
645 .. _`file objects`:
646    http://www.python.org/doc/current/lib/bltin-file-objects.html
647
648 Обратите внимание на то, что ``ftputil`` поддерживает и двоичный и текстовый режимы
649 работы со строкой завершающей преобразования.
650
651 Советы и подсказки / FAQ
652 ------------------------
653
654 Где я могу получить самую последнюю версию?
655 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
656
657 Смотрите http://www.sschwarzer.net/python/python_software.html#ftputil.
658 Объявления относительно новых версий будут рассылаться списку адресатов (см. вопрос ниже).
659 Объявления относительно появления главных модификаций отправляются в
660 службу новостей `comp.lang.python`_ .
661
662 .. _`comp.lang.python`: news:comp.lang.python
663
664 Имеется ли почтовый ящик на ``ftputil``?
665 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
666
667 Да, вы можете подписаться на
668 http://codespeak.net/mailman/listinfo/ftputil
669 или прочитать архивы на http://codespeak.net/pipermail/ftputil/.
670
671 Я нашел ошибку! Что теперь?
672 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
673
674 Перед сообщением об ошибке, удостоверьтесь в том, что Вы пользовались самой последней версией
675 ``ftputil``. Эта ошибка уже могла быть устранена.
676
677 Пожалуйста отправьте  отчёт об ошибке (на английском языке) на почтовый ящик  ``ftputil``
678 или вышлите его прямо мне (адрес электронного почтового ящика приведен в начале этого файла).
679 В *любом* случае Вы *не должны* включать конфиденциальную информацию
680 (логин пользователя, пароль, имена файлов, и т.п.) в Ваше письмо.
681
682
683 В сообщении об ошибке, пожалуйста, введите следующую информацию:
684
685 - версия ``ftputil``
686
687 - версия Python
688
689 - тип и версия  FTP сервера (отображается в "сообщении приветствия")
690
691 - операционные системы и их версии на сервере и клиенте
692   (выводятся при вводе командной строки ``uname -a`` на Unix)
693
694 - описание ошибки
695
696 - если возможно, то краткий пример кода, который приводит к ошибке
697
698 - если возможно, то идеи, которые бы помогли найти причину ошибки
699
700 Соединение по другому порту
701 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
702
703 По умолчанию, ``FTPHost`` объект соединяется по обычному  FTP порту.
704 Если Вы хотите использовать другой порт, то просмотрите раздел `FTPHost construction`_.
705
706 Вы можете использовать тот же самый подход  как при подключении в активном режиме,
707 так и при подключении в пассивном режиме, как Вам нравится.
708
709 Использование активных или пассивных подключений
710 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
711
712 См. предыдущий совет.
713
714 Условная отправка/загрузка с/на сервер(а) в различных часовых поясах
715 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
716
717 Вы можете заметить, что ``ftputil`` отправляет или загружает лишние файлы,
718 когда это не требуется. Это может случаться тогда, когда FTP сервер и клиент,
719 на котором запущена библиотека ``ftputil``, находятся в различных часовых поясах.
720 Смотрите раздел по установке `time shift`_.
721 Может быть, достаточно вызвать метод `synchronize_times`_.
722
723 Выдаются неправильные даты или время при выполнении  stat - методов на сервере
724 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
725
726 См. предыдущий и следующий советы.
727
728 Файл - связанные методы-запросы (например: listdir) возвращают неожиданные результаты
729 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
730
731 Если, например, ``listdir`` или ``lstat`` возвращают неправильное значение
732 или вызывают исключение, то это может происходить из-за неправильно
733 определенного формата каталога. См. `set_directory_format`_.
734
735 Я не нахожу ответ на мою проблему в этом документе
736 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
737
738 Пожалуйста, вышлите мне на электронный почтовый ящик Ваш вопрос, и я посмотрю,
739 что смогу для Вас сделать. :-) Вероятно лучший способ заключается в том,
740 чтобы выслать ваш вопрос по адресу  ftputil@codespeak.net;
741 потенциально, гораздо большее число людей сможет помочь Вам.
742
743 Ошибки и ограничения
744 --------------------
745
746 - ``ftputil`` нуждается в версии Python 2.0 или выше.
747
748 - При выполнении  ``lstat`` метода возвращается неправильное значение для корневого каталога
749   ``/``. Если Вы знаете как решить эту проблему, пожалуйста, сообщите мне.
750   Корневой каталог может использоваться в таких методах, соответственно:
751   ``FTPHost.path.exists/isfile/isdir/islink``,
752   хотя...
753
754 - Блокировка времени исполнения индивидуальных дочерних процессов.
755   Эта проблема возникает в том случае, если ``FTPHost`` объект, или
756   генерированные ``FTPFile`` объекты не используются в течение 10 минут и более.
757
758 - До сих пор, я не обращал внимание на безопасность потока.
759   В принципе, по крайней мере, различные ``FTPFile``
760   объекты должны работать в различных потоках.
761
762 - ``FTPFile`` объекты в текстовом режиме  *не поддерживают символы*
763   размером больше одного байта. Пожалуйста, отправьте мне письмо,
764   если вы работатете с мультибайтовыми потоками текста в ваших  FTP сеансах.
765
766 - В данной версии невозможно прервать процесс отправки и загрузки файлов.
767   Свяжитесь со мной, если у Вас возникли с этим проблемы.
768
769 - ``UserTuple`` класс в модуле  ``UserTuple.py``, пока полностью не проверен.
770   Если у вас возникла проблема при работе с этим классом, сообщите мне.
771
772 Файлы
773 -----
774
775 Если не изменены опции инсталляции, то ``ftputil`` файлы
776 будут размещены в `ftputil`` пакете. Документация (в
777 `reStructured Text`_ и в формате HTML ) находится в той же самой директории.
778
779 .. _`reStructured Text`: http://docutils.sourceforge.net/rst.html
780
781 Файлы ``_test_*.py`` и ``_mock_ftplib.py`` служат для тестирования модуля.
782 Если Вы  *используете* библиотеку ftputil (т.е. *не модифицируете* её),
783 Вы можете удалить эти файлы.
784
785 Справочники
786 -----------
787
788 - Mackinnon T, Freeman S, Craig P. 2000. `Endo-Testing:
789   Unit Testing with Mock Objects`_.
790
791 - Postel J, Reynolds J. 1985. `RFC 959 - File Transfer Protocol (FTP)`_.
792
793 - Van Rossum G, Drake Jr FL. 2003. `Python Library Reference`_.
794
795 .. _`Endo-Testing: Unit Testing with Mock Objects`:
796    http://www.connextra.com/aboutUs/mockobjects.pdf
797 .. _`RFC 959 - File Transfer Protocol (FTP)`: http://www.ietf.org/rfc/rfc959.txt
798 .. _`Python Library Reference`: http://www.python.org/doc/current/lib/lib.html
799
800 Автор
801 -----
802
803 Библиотека ``ftputil`` написана Стефаном Шварцером (Stefan Schwarzer)
804 <sschwarzer@sschwarzer.net>.
805
806 Обратная связь учтена. :-)
807