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