python os.popen завершается неудачно, когда ему дан умляженный символ - PullRequest
3 голосов
/ 06 октября 2011

Под winxp (pro x64 версия 2003, sp2) работает следующее в командной строке cmd:

dir C:\testüüüdirectory\

Обратите внимание на символ «ü».

Но из python 2.7.1.4 следующее всегда возвращает код ошибки 1:

>>> res = os.popen("dir C:\\testüüüdirectory\\")
>>> res.close()
1
>>>

Как я могу получить popen, чтобы принять символ ü?

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Возможно, это проблема кодирования, когда ваш ввод не совсем соответствует тому, что файловая система ожидает при выводе. Сначала вам нужно сообщить Python, какую кодировку использует ваш ввод, а затем какую кодировку ожидает вызов popen().

>>> filename = "C:\\testüüüdirectory\\".decode("utf-8")
>>> res = os.popen("dir " + filename.encode("cp1252"))

Возможно, вам придется поэкспериментировать с различными комбинациями кодирования, чтобы получить правильную пару. UTF-8, UTF-16 и cp1252 являются наиболее вероятными кандидатами для Windows, но ваша система может быть настроена на использование другой кодировки . Если вам действительно повезет, os.popen() может даже принять строку Unicode, в этом случае шаг encode() может быть пропущен.

Если вам действительно не повезло, канонизация символов может стать проблемой. Есть два возможных представления «ü» в Unicode: U + 00FC или U + 0075 U + 0308; вторая буква "U" с комбинированным диарезом, а первая - предварительно комбинированная. Если Windows ожидает одно, а encode() производит другое, вам, возможно, придется немного поработать, чтобы получить правильную строку.

0 голосов
/ 06 октября 2011

Попробуйте с u перед строкой:

 res = os.popen(u"dir C:\\testüüüdirectory\\")

Подробнее о строках Юникода / лексическом анализе

Проверка sys.getfilesystemencoding также, чтобы убедиться, что вы можете иметь такие имена файлов.

...