【问题标题】:Building an UCS4 string buffer in python 2.7 ctypes在 python 2.7 ctypes 中构建 UCS4 字符串缓冲区
【发布时间】: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


    【解决方案1】:

    这并没有回答标题中关于专门构建UCS4 缓冲区的部分。但它以粗体给出了问题的部分答案,并设法创建了一个似乎适用于我当前在 windows 上的 python 2.7 上的 unicode 缓冲区:(所以可能不需要 UCS4)。

    所以我们在这里假设 c_wchar 是 windows 需要的(如果是 UCS4 或 UCS2 对我来说还不是很清楚,它可能并不重要,但我认为我对我的知识在这里)。

    所以这里是重现问题中要求的 C 代码的 python 代码:

    ## creation of buffer of size totalsize
    wenv = (c_wchar * totalsize)()    
    wenv.value = (unicode("").join([
        unicode("%s=%s\0") % (key, value)
        for k, v in env.items()])) + "\0"
    

    然后可以将此wenv 提供给CreateProcessW,这似乎有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多