在尝试重新创建getenvironment(..)
C 函数_winapi.c
(直接链接 https://github.com/python/cpython/blob/202fda55c2dffe27125703225e5af92254602dc6/Modules/_winapi.c#L754-L777)在普通的Python中使用ctypes
, 我想知道如何翻译以下 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 https://docs.python.org/2/library/ctypes.html#ctypes.create_unicode_buffer, code https://github.com/python/cpython/blob/1aa1803b3df2af9481628b8896babbd686d314ff/Lib/ctypes/__init__.py#L294-L310)正在做一些非常接近的事情,只要我能够访问,我就可以重现Py_UCS4
C 类型或确保其与 python 可访问的任何其他类型的链接ctypes
.
Would c_wchar
是一个很好的候选人?,但似乎我不能做出这个假设,因为 python 2.7 可以编译UCS-2
如果我是对的(source https://stackoverflow.com/a/28786554/458681),我想 Windows 确实在等待UCS-4
那里……即使看起来ctypes.wintypes.LPWSTR
是一个别名c_wchart_p
在 cPython 2.7 中(code https://github.com/python/cpython/blob/1aa1803b3df2af9481628b8896babbd686d314ff/Lib/ctypes/wintypes.py#L35).
对于这个问题,如果有帮助的话,可以安全地假设目标平台是 Windows 上的 python 2.7。
Context(如果它有一定的重要性):
我正在第一次深入研究ctypes
尝试用简单的 Python 修复 cPython 2.7 的 Windows 错误subprocess.Popen(..)
执行。这个错误是无法修复的 https://bugs.python.org/issue19264。此错误阻止在命令行调用中使用 unicode(作为可执行文件名称或参数)。这是在 python 3 中修复的,所以我尝试在普通 python 中反向实现所需的实际 cPython3 实现CreateProcess(..)
in _winapi.c
依次调用getenvironment(..)
。
评论中提到了这种可能的解决方法这个答案 https://stackoverflow.com/a/9113914/458681相关问题subprocess.Popen(..)
统一码问题。