2015-08-18 3 views
4

Я столкнулся некоторые проблемы с переключением строки из Python 2.x в Python 3Струны Issue работы при переключении с Python 2.x на Python 3

Выпуск 1:

from ctypes import* 
charBuffer=create_string_buffer(1000) 
var = charBuffer.value # var contains like this "abc:def:ghi:1234" 
a,b,c,d= var.split(':') 

Это прекрасно работает в Python 2.x, но не в 3.х он бросает некоторые ошибки как этот а, б, в, г = var.split («:») TypeError: «ул» не поддерживает интерфейс буфера

Я получил ссылки после некоторых исследований в stackoverflow linklink2

Если я печатаю, желаемый результат будет

a= abc 
b =def 
c=ghi 
d=1234 

Issue2:

from ctypes import* 
cdll = "Windll" 
var = 0x1fffffffffffffffffffffff # I want to send this long variable to character pointer which is in cdll 

charBuf =create_string_buffer(var.to_bytes(32,'little')) 
cdll.createBuff (charBuf) 

cdll function 
int createBuff (char * charBuff){ 
    print charBuff 
    return 0; 
} 

Я хочу послать эту длинную переменную символьный указатель, который находится в cdll, так как его символьный указатель его ошибки бросания. Нужны ваши ценные материалы о том, как я могу это достичь. Заранее спасибо

+0

@ Vineet Kumar Doshi, добавил желаемый результат в моей постановке задачи –

ответ

2

В Python 3.x, '.value' при возврате create_string_buffer() возвращает строку байта.

В вашем примере вы пытаетесь разбить строку байта, используя строку Unicode (которая является нормальной строкой в ​​Python 3.x). Это то, что вызывает вашу проблему.

Вам нужно будет либо разделить байтовую строку. Пример -

a,b,c,d = var.split(b':') 

Или вы можете декодировать байт строки в строку Unicode, используя метод на нем ') (.decode.

Пример -

var = var.decode('<encoding>') 
+0

Я бы отговорил второй пример. Разделение строки юникода с байтовой строкой асимметрично. То есть, он работает на py2, но не py3. например. 'u" a b ".split (b" ")'. – Dunes

+0

Спасибо, много работает! Я добавил четкую цель для постановки проблемы, не могли бы вы проверить. –

+0

Правда, но я просто предлагал эту переменную var или другие переменные в качестве обычной строки (а не строки байта). Если это необходимо только для отправки в функцию c, то первым является рекомендуемый подход. –

0

Split с помощью b":" и вам будет хорошо в обеих версиях питона.

В py2 str является байтовым, в py3 str является объектом юникода. Объект, возвращаемый буфером строк ctypes, является байтовым (str на py2 и bytes на py3). Записывая строковый литерал как b"..., вы вынуждаете его быть байтовой в обеих версиях python.

+0

Отлично! он работал, я добавил четкую цель для постановки проблемы, не могли бы вы проверить. –

+0

@ Dunes in issue2 сталкивается с некоторой проблемой при отправке 128 nit Длинное целое число в указатель символов в cdll, как я могу совместиться с python, не могли бы вы помочь? –

 Смежные вопросы

  • Нет связанных вопросов^_^