Странная проблема с входным кодированием в IPython

Я выполняю python 2.6 с последним IPython на Windows XP SP3, и у меня есть два вопроса. Сначала одна из моих проблем, когда под IPython, я не могу ввести строки Unicode непосредственно, и, в результате не могу открыть файлы с нелатинскими именами. Позвольте мне продемонстрировать. В соответствии с обычным Python это работает:

>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'mbcs'
>>> fd = open(u'm:/Блокнот/home.tdl')
>>> print u'm:/Блокнот/home.tdl'
m:/Блокнот/home.tdl
>>>

Это является кириллическим там, между прочим. И под IPython я добираюсь:

In [49]: sys.getdefaultencoding()
Out[49]: 'ascii'

In [50]: sys.getfilesystemencoding()
Out[50]: 'mbcs'

In [52]: fd = open(u'm:/Блокнот/home.tdl')
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)

C:\Documents and Settings\andrey\<ipython console> in <module>()

IOError: [Errno 2] No such file or directory: u'm:/\x81\xab\xae\xaa\xad\xae\xe2/home.tdl'

In [53]: print u'm:/Блокнот/home.tdl'
-------------->print(u'm:/Блокнот/home.tdl')
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (15, 0))

---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)

C:\Documents and Settings\andrey\<ipython console> in <module>()

C:\Program Files\Python26\lib\encodings\cp866.pyc in encode(self, input, errors)
     10
     11     def encode(self,input,errors='strict'):
---> 12         return codecs.charmap_encode(input,errors,encoding_map)
     13
     14     def decode(self,input,errors='strict'):

UnicodeEncodeError: 'charmap' codec can't encode characters in position 3-9: character maps to <und

In [54]:

Вторая проблема менее печальна, но все еще. Когда я пытаюсь открыть файл и определить аргумент имени файла как non-unicode строка, он не открывается. Я должен насильственно декодировать строку от набора символов OEM, прежде чем я мог открыть файлы, который довольно неудобен:

>>> fd2 = open('m:/Блокнот/home.tdl'.decode('cp866'))
>>>

Возможно, это имеет что-то к с моими региональными настройками, я не знаю, потому что я не могу даже вырезать и вставить кириллический текст от консоли. Я поместил "русский язык" везде в региональные настройки, но это, кажется, не работает.

13
задан Andrey Balaguta 14 February 2010 в 10:58
поделиться

1 ответ

Чем больше я думаю об этом, тем больше я думаю, что вы должны доверять своему хостингу. Я бы убедился, что хостинг-сервис имеет "шкуру в игре": то есть, что они размещают достаточно "громких" аккаунтов, которые будут признаны не заслуживающими доверия, будет очень дорого для них (в потерянных аккаунтах и продажах).

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

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

О, говоря о привилегиях: Может ли задача, которую необходимо автоматизировать, быть выполнена с целевой учетной записью с пониженными привилегиями, такой как учетная запись только для чтения, или с учетной записью, которая не может вносить какие-либо изменения в свой профиль? Наличие только ваших учетных данных с низкими привилегиями на хостинге снизит ваш риск (или "подверженность", как любит говорить полисиллабическая толпа).

Предыдущий ответ, который был признан неработоспособным, находится ниже строки.


Вы можете зашифровать идентификатор пользователя и пароль, используя еще один пароль. Для запуска скрипт должен быть снабжен паролем и . Этот пароль используется для расшифровки имени пользователя и пароля веб-службы. Убедитесь, что пароль скрипта не хранится нигде, а хранится только в памяти и только достаточно долго, чтобы расшифровать окончательный идентификатор пользователя и пароль.

Если это действительно важно, убедитесь, что ваше подключение для запуска скрипта является криптографическим (ssh, ssl и т.д.), и убедитесь, что скрипт использует только https для входа в систему.

Это не делает вас неуязвимым для кого-то с корневыми привилегиями в поле (в какой-то момент открытый идентификатор пользователя и пароль будут находиться в памяти и, следовательно, уязвимы), но для получения идентификатора пользователя/пароля им требуется больше работы.

Обновлено : Требование автоматизации делает вышеуказанное решение безупречным.

-121--5086039-

Если вы только начали разработку с веб-сервисов, то вы должны посмотреть на servicestack.net это платформа веб-сервисов с открытым исходным кодом, которая уменьшает кривую обучения при создании и использовании веб-сервисов, вот "живой пример", показывающий вам весь исходный код, необходимый для создания и вызова простых веб-сервисов из приложений Ajax, Android iOS или Silverlight:

https://github.com/ServiceStackApps/LiveDemos

-121--4378754-

Да. Ввод Юникода на консоли всегда проблематичен и, как правило, лучше избегать, но IPython особенно нарушен . Он преобразует символы, вводимые на его консоли, как если бы они были закодированы в ISO-8859-1, независимо от фактической кодировки.

На данный момент вам придется сказать u :/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl '.

12
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: