【发布时间】:2017-08-04 11:43:59
【问题描述】:
为了尝试使用ctypes 在普通python 中重新创建_winapi.c (direct link) 的getenvironment(..) C 函数,我想知道如何翻译以下C 代码 :
buffer = PyMem_NEW(Py_UCS4, totalsize);
if (! buffer) {
PyErr_NoMemory();
goto error;
}
p = buffer;
end = buffer + totalsize;
for (i = 0; i < envsize; i++) {
PyObject* key = PyList_GET_ITEM(keys, i);
PyObject* value = PyList_GET_ITEM(values, i);
if (!PyUnicode_AsUCS4(key, p, end - p, 0))
goto error;
p += PyUnicode_GET_LENGTH(key);
*p++ = '=';
if (!PyUnicode_AsUCS4(value, p, end - p, 0))
goto error;
p += PyUnicode_GET_LENGTH(value);
*p++ = '\0';
}
/* add trailing null byte */
*p++ = '\0';
似乎函数ctypes.create_unicode_buffer(..) (doc, code) 正在做一些非常接近的事情,如果我可以访问Py_UCS4 C 类型或确保它与任何python 可以通过ctypes 访问的其他类型。
c_wchar 会是一个很好的候选人吗?但我似乎无法做出这样的假设,因为如果我是对的 (source),python 2.7 可以在UCS-2 中编译,我猜 windows 是真的在等待UCS-4 那里......即使看起来ctypes.wintypes.LPWSTR 是cPython 2.7 中c_wchart_p 的别名(code)。
对于这个问题,如果有帮助,可以假设目标平台是 Windows 上的 python 2.7。
上下文(如果它有一定的重要性):
我正在第一次在ctypes 中进行钻研,以尝试在 cPython 2.7 的 Windows subprocess.Popen(..) 实现中的 bug 上进行简单的 python 修复。 This bug is a won't fix。此错误阻止在命令行调用中使用 unicode(作为可执行名称或参数)。这在 python 3 中已修复,因此我尝试在普通 python 中反向实现所需的 CreateProcess(..) 在 _winapi.c 中的实际 cPython3 实现,它依次调用 getenvironment(..)。
this answer 的 cmets 中提到了与 subprocess.Popen(..) unicode 问题相关的问题。
【问题讨论】:
标签: windows python-2.7 unicode ctypes