Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 26, 2012 10:03:28

Immor+al
От:
Зарегистрирован: 2011-03-10
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Мигрировал на 3.2.2 и subprocess отдает b'строки' в консоль, почему?

Например вывод команды ‘time /T’ будет:
b'10:55 AM\r\n'
Как сделать, чтобы не было мусора, а была только строка “10:55 AM”?

Реально у меня такой код:

def getBranchName():
process = subprocess.Popen('git symbolic-ref -q HEAD', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(stdoutdata, stderrdata) = process.communicate()
current_branch = str(stdoutdata)
current_branch = current_branch.replace("refs/heads/","")
current_branch = current_branch.replace("\n","")
return current_branch
...
print("Branch: "+ getBranchName())
Возвращает: Branch: b'master\n'

На питоне 2.7.2 такой фигни не было!
У меня консольная тулза, а это сильно уродует вывод.



Офлайн

#2 Янв. 26, 2012 10:05:41

Immor+al
От:
Зарегистрирован: 2011-03-10
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Мигрировал на 3.2.2 и subprocess отдает b'строки' в консоль, почему?

Я пробовал:
print(b“abcde”.decode(“utf-8”)) #Работает!
print(“UNCOMMITED FILES; Branch: ”+ str(getBranchName()).decode(“utf-8”)) #AttributeError: ‘str’ object has no attribute ‘decode’

Все остальные строки у меня стали юникодными автоматически, кроме этой, оказалось нужно не:
current_branch = str(stdoutdata)
а:
current_branch = str(stdoutdata, “utf-8”)

как сделать, чтобы скрипт поддерживался и 2 и 3 версией питона?
просто добавить if sys.version_info > (3, 0): else и выполнять только одну из строчек кода выше?



Отредактировано (Янв. 26, 2012 10:27:22)

Офлайн

#3 Янв. 26, 2012 13:26:45

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Мигрировал на 3.2.2 и subprocess отдает b'строки' в консоль, почему?

Одними только if…else здесь не обойтись - много несовместимых синтаксических конструкций. Да и мучения будут сплошные.
Для разработки советуют писать для версии 2, а для тройки - прогонять через 2to3.

http://wiki.python.org/moin/Python2orPython3
http://www.python.org/dev/peps/pep-3000/#id9



Офлайн

#4 Янв. 26, 2012 16:10:38

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Мигрировал на 3.2.2 и subprocess отдает b'строки' в консоль, почему?

2.7 -> 3.2
'xxx' -> b'xxx' # байты
u'xxx' -> ‘xxx’ # строки

идея такая:
1) при получении байтов из вне (process.communicate) переводите их в уникод строку,
2) работайте со строкой,
3) при отправке наружу (print) переводите строку в байты.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version