У меня есть приложения для резервного копирования на python, которые должны работать в Windows. Требуется совместимость с UTF (чтобы иметь возможность создавать резервные копии каталогов, содержащих символы UTF, такие как итальянские акценты). Проблема в том, что он использует внешние программы (plink, cygwin, ssh и rsync), и я не могу заставить их работать. Прототип состоит из 32 строк, взгляните:
# -*- coding: utf-8 -*-
import subprocess
def safestr(obj, encoding='utf-8'):
r"""Converts any given object to utf-8 encoded string.
>>> safestr('hello')
'hello'
>>> safestr(u'\u1234')
'\xe1\x88\xb4'
>>> safestr(2)
'2'
"""
if isinstance(obj, unicode):
return obj.encode("utf-8")
elif isinstance(obj, str):
return obj.encode
else:
return str(obj)
def execute(command):
pipe = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
out, errs = pipe.communicate()
retcode = pipe.poll()
print "OUT: " + repr(out)
print "ERRS: " + repr(errs)
print "RET: " + str(retcode)
command = u'rsync --stats -az --numeric-ids --delete --blocking-io --modify-window=2 --no-group --chmod=u=rwX,g=,o= -e \'cygnative plink -ssh -2 -batch -pw test \' "/cygdrive/c/κόσμε" [email protected]:/volatile/backup/vaidab/2010-03-03.15_41_56/ --link-dest=../2010-03-03.15_00_57'.encode('utf-8')
execute(command)
Все еще не работает с версией nosklo, проверьте результат:
python prototype_unicode_new.py 'rsync.exe --stats -az --numeric-ids --delete --blocking-io --modify-window=2 -- no-group --chmod=u=rwX,g=,o = -e "cygnative plink -ssh -2 -batch -pw test" /cygdr ive/c/\xce\xba\xcf\x8c\xcf\x83\xce\xbc\xce\xb5 [email protected]:/volatile /резервная копия/vaidab/2010-03-03.15_41_56/'
OUT: '\nКоличество файлов: 0\nКоличество переданных файлов: 0\nОбщий размер файла: 0 байт\nОбщий размер переданного файла: 0 байт\nЛитеральные данные: 0 байт\nСопоставленные данные: 0 байт\nРазмер списка файлов: 9 \nВремя создания списка файлов: 0,001 секунды\nВремя передачи списка файлов: 0,000 секунд\nВсего отправлено байтов: 22\nВсего получено байтов: 12\n\ nОтправлено 22 получено байтов 12 байтов 68,00 байт/сек\nОбщий размер равен 0, ускорение равно 0,00\ n' ОШИБКИ: 'rsync: link_stat "/cygdrive/c/\xc3\x8e\xc2\xba\xc3\x8f\xc5\x92\xc3\x8f\xc 6\x92\xc3\x8e\xc2\xbc\xc3\ x8e\xc2\xb5" не удалось: такого файла или каталога нет (2)\nrs ошибка синхронизации: некоторые файлы/атрибуты не были переданы (см. предыдущие ошибки) (код 23) в /home/lapo/packaging/rsync-3.0.6 -1/src/rsync-3.0.6/main.c(1039) [отправитель=3.0. 6]\n' РЕТ: 23