在 python 2.7 ctypes 中构建 UCS4 字符串缓冲区

2023-12-27

在尝试重新创建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_UCS4C 类型或确保其与 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(..)统一码问题。


这并没有具体回答标题中有关构建的部分UCS4缓冲。但它以粗体给出了问题的部分答案,并设法创建了一个 unicode 缓冲区,该缓冲区似乎适用于我当前在 Windows 上的 python 2.7:(所以也许不需要 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"

This wenv然后可以喂给CreateProcessW这似乎有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 2.7 ctypes 中构建 UCS4 字符串缓冲区 的相关文章

  • SetCurrentDirectoryW 中的错误 206

    在我之后之前不清楚的问题 https stackoverflow com questions 44389617 long path name in setcurrentdirectoryw 我以某种方式能够创建一个具有长路径名的目录 但是
  • 绘制与Fig.show()内联的IPython Notebook图形?

    我正在使用 IPython Notebook 调用内联模式 pylab inline 以下代码立即在单元格处绘制一个图形 fig plt figure axes fig add axes 0 0 1 1 不过 我想在一个单元格中创建绘图 轴
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Python 3.4 十六进制转日语字符

    我目前正在编写一个脚本 从我的网站中提取包含日语字符的信息 到目前为止 我的脚本已从网站上提取数据 它以字符串形式返回 xe5 xb9 xb4 xe3 x81 xab xe4 xb8 x80 xe5 xba xa6 xe3 x81 xae
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 当我启动 Windows 命令提示符时,我做了什么导致环境变量发生更改?

    我使用的是 Windows 10 x64 我安装了 Anaconda3 如果我启动 C Windows system32 cmd exe 时没有运行任何其他内容 并且在我可以看到的后台中没有任何有趣的内容 则以下内容将添加到控制面板 UI
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 如何在自托管 WCF 中获取多部分表单数据?

    我已经搜索了很长一段时间 但没有找到我要找的东西 我在 Windows 应用程序中自行托管了一个 http WCF 现在 在我的服务方法之一中 我需要接收一个文件和一些表单数据字段 在类似的问题中 情况要么发送一个文件 这是通过流数据然后转
  • Windows 10 上的 LibPNG 构建问题

    我试图在 Windows 10 上构建 libpng 以获取 win32 二进制文件 但我认为有一个与 awk 解析带有 CRLF 行结尾的文件相关的问题 我尝试使用 dos2unix 命令转换文件 但没有成功 结果相同 在 make 命令
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include
  • 为什么 Windows 命令 DIR 在搜索 *.tif 文件时也会输出 *.tiff 文件?

    我想使用 Windows 命令DIR为了找到唯一TIF文件 即具有扩展名的文件 tif 因此我使用以下小批处理文件 for f delims a IN dir b a d s C wolter testversion input tif d
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize

随机推荐

  • NSTableView 行中的垂直对齐文本

    我对 NSTableView 有一个小问题 当我增加表中一行的高度时 其中的文本在行顶部对齐 但我想将其垂直居中对齐 谁能建议我有什么方法可以做到这一点 Thanks Miraaj 这是一个简单的代码解决方案 显示了可用于居中对齐 Text
  • Spark 广播变量 Map 给出 null 值

    我正在使用 java8 和 Spark v2 4 1 我正在尝试使用广播变量Map查找使用如下所示 输入数据 code1 code2 code3 1 7 5 2 7 4 3 7 3 4 7 2 5 7 1 预期输出 code1 code2
  • SystemC 中的增量周期和增量通知是什么?

    在SystemC中 有一种通知叫做delta通知 可以通过以下两种方法调用 event notify SC ZERO TIME or event notify 0 SC NS 它定义在增量通知调用中 对事件敏感的进程将在下一个增量周期的评估
  • 正则表达式以避免给定的一组子字符串[重复]

    这个问题在这里已经有答案了 我正在寻找一个可以匹配不包含给定子字符串集的所有内容的单个正则表达式 例如 正则表达式将匹配不包含子字符串 abc def ghi 的所有内容 在此示例中 正则表达式将匹配 student apple 和 mar
  • Django:将 CharField 转换为 TextField 且数据完好无损

    有没有办法将 CharField 更改为 TextField 并保持此列中的数据完好无损 现在我有以下内容 class TestLog models Model failed reqs models CharField max length
  • MongoDB 聚合 PHP,按小时分组

    我有以下格式的文档 id ObjectId 12e123123123123123 client id 12345667889 resource test test version v2 ts new Date Wed 02 Jan 2013
  • 异常处理策略——重用异常代码

    我正在开发一个应用程序 其过程如下所示 UI gt backend process gt result to UI 在我的Java代码中 我使用try catch处理异常 但是在代码中我有很多重复的异常 可能会在不同的类中抛出相同的异常 这
  • 为什么我的 JQL 查询返回的结果与等效的 CriteriaBuilder 查询不同?

    我正在使用 Dropwizard Hibernate 但我的测试遇到问题 我已经尽可能简化了这个例子 我创建一个Foo 更新它 然后尝试获取它 使用原始查询可以获得正确的结果 但等效的 CriteriaBuilder 查询无法捕获更新 我究
  • 如何求两个向量的和?

    我从三个带有 x 和 y 值的点开始 我真正想要的是实际向量的位置 查看提供的图像 你能帮助我吗 我尝试了一些 atan2 和平行四边形 但不幸的是没有成功 再次 我会提醒我可能会遗漏一些东西 但我think这是非常简单的向量加法 let
  • 如何对 WPF ListView 中的项目进行分组

    我有一个ListView我想将结果分组 但是我找到的示例不起作用 如何对结果进行分组 我想分组Status自定义对象的属性 这就是我所拥有的
  • Silverlight 2 拖放教程

    我想知道人们是否可以建议最好的教程 引导我使用 MS Silverlight V2 完成拖放和控件碰撞检测等的最佳方法 我已经做了杰西自由教程 http silverlight net learn tutorials aspx在 Silve
  • 打印其中包含 php 变量的字符串

    对于你们来说 我想这会很容易 div class vote pct style width 1px 我希望变量为 width 并使其末尾有 px 如果我加一个空格 它就不起作用 如果我将它们放在一起 它会将其视为一个大变量名 我可以向某人询
  • WebSocket 和普通套接字通信有什么区别?

    根据维基百科 http en wikipedia org wiki WebSocket HTTP 和 WebSocket 之间的唯一关系是一个额外的握手形式Upgrade HTTP request 之后 浏览器和 HTTP 服务器似乎将仅通
  • 在 C++ 中,我需要在关闭程序之前释放内存吗[重复]

    这个问题在这里已经有答案了 可能的重复 不释放内存是否可以接受 https stackoverflow com questions 496487 is it acceptable not to deallocate memory 这是一个一
  • Robolectric 测试需要等待线程上的某些内容

    我的班级是这样做的 public void doThing Doer doer new Doer Thread thread new Thread doer thread start Doer 类是一个内部类 private class D
  • 名称无效的表单控件...不可聚焦

    name additional here about other field 的无效表单控件不可聚焦 此代码适用于具有四个下拉列表的选择字段 需要几个选项 additional here about other field和 additio
  • java中是否有最简单的reduce/fold方法?

    我知道的其他技术 Net JS 包含最简单的折叠 归约操作 TResult reduce TResult result TResult prevResult TValue value gt TResult 我发现的一种方法要求 TValue
  • EntityFramework t4 模板 - XML 文档

    我的 EDMX 文件存在以下问题 我在其中编写了一些属性和实体的文档 但 EF 5 的 t4 模板不会生成这些值 我想要的结果应该是 public class Person
  • Android 列表视图中的 Google 地图加载问题

    我试图在我的列表视图上显示地图视图 地图无法在列表视图中加载 如果我触摸地图视图 地图就会加载 如果我滚动列表视图 地图视图将进入卸载初始阶段 给出了我的列表视图适配器和屏幕截图 公共类 OfferListAdapter 扩展 BaseAd
  • 在 python 2.7 ctypes 中构建 UCS4 字符串缓冲区

    在尝试重新创建getenvironment C 函数 winapi c 直接链接 https github com python cpython blob 202fda55c2dffe27125703225e5af92254602dc6 M