在python 2.x的ctypes文档中,我们有:
>>> printf("String '%s', Int %d, Double %f\n", "Hi", 10, 2.2)
根据python 3.x的ctypes文档,我们有:
>>> printf(b"String '%s', Int %d, Double %f\n", b"Hi", 10, 2.2)
因此,在一个案例中,c_char_p
的argtypes需要str
作为输入,而在第二种情况下,它需要bytes
。我应该如何编写我的函数来处理python 2.x和python 3.x?
典型情况是:
my_c_func.argtypes = [ c_char_p ]
if __name__ == '__main__':
import sys
filename = sys.argv[1];
my_c_func( filename )
答案 0 :(得分:1)
这些类型是等效的。在C字符串中是char类型的数组或指针(每个char由一个字节表示)。在python 3中,最接近的数据类型是bytes
。 python 3中的字符串使用UTF-8编码,因此不保证每个字符都只是一个字节。然而,在python 2中,字符串通常使用Latin-1进行编码(取决于您认为的语言环境) - 一个字符,一个字节。
要编写与解释器版本无关的代码,您应该只编写b"your string"
。这将在python 2中创建一个str
对象,在python 3中创建一个bytes
对象。相反,为了保证unicode字符串使用u"your string"
。这将在python 2中创建一个unicode
对象,在python 3中创建一个str
对象。