使用ctypes

时间:2015-08-03 15:21:24

标签: python bytearray ctypes

我需要使用ctypes将路径从Python传递到C ++库。 如果我将路径指定为

path = b"..\\xml_mapping_rule\\AixLib_Mapping_Rule.xml"
一切正常。但现在我必须创建这样的路径

path = os.path.join(rootPath, "\\AixLib_Mapping_Rule.xml")

适用于Python 2,但不适用于Python 3。 如何将路径转换为bytearray(我相信这是字符串前面的b)?

我在SO上可以找到的最接近的问题就是这个: Passing a path to Labview DLL in Python

2 个答案:

答案 0 :(得分:1)

尝试类似:

path = os.path.join(root_path, "AixLib_Mapping_Rule.xml")
return path.encode('utf-8') # or 'latin-1' or 'cp1252' 

在python 2中,字符串是一个字节序列,但在python 3中,它是一个unicode代码点序列。 "编码"字符串是将代码点转换为字节序列的过程。

答案 1 :(得分:1)

您必须通过编码将Unicode字符串转换为字节字符串,如下所示:

path = path.encode('ascii')
path = bytes(path, 'ascii')

如果您想使用正确的编码,请尝试sys.getfilesystemencoding(),如下所示:

import ctypes
import os
import sys

libc = ctypes.CDLL('libc.so.6')
fs_enc = sys.getfilesystemencoding()

rootPath = "/tmp"
path = os.path.join(rootPath, "AixLib_Mapping_Rule.xml")
path = path.encode(fs_enc)

fd = libc.open(path, 0, 0)