python 2.x和3.x的便携式ctypes.c_char_p

时间:2015-04-29 14:22:22

标签: python ctypes

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 )

1 个答案:

答案 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对象。