【发布时间】:2016-05-27 03:06:17
【问题描述】:
我正在尝试遵循 Gray Hat Python 示例之一,它在 Python 2.7 中运行良好,但在 Python 3.5 中,结果被截断。
from ctypes import *
msvcrt = cdll.msvcrt
message_string = "Hello World!\n"
msvcrt.printf("Testing: %s\n", message_string)
您可以在下面看到上面代码的输出只是字母T。
基于与此类似的其他一些帖子,在最后一行添加b 会有所帮助,但随后message_string 会被截断。
from ctypes import *
msvcrt = cdll.msvcrt
message_string = "Hello World!\n"
msvcrt.printf(b"Testing: %s\n", message_string)
如何在 Windows 7 或 10 上使用 Python 3.5 打印存储在 message_string 变量中的整个字符串?
【问题讨论】:
-
您是否尝试将文本编码为函数可以处理的字符集?
-
设置
msvcrt.printf.argtypes = (ctypes.c_char_p,)强制类型检查第一个参数。这个可变参数函数的附加参数取决于格式字符串,所以不要选中它们,但在这里使用常识。 Python 3 使用 Unicode 字符串,因此您必须将字符串编码为bytes,正如前面的评论所建议的那样。此外,避免使用cdll,因为它全局缓存模块,缓存函数指针,这会导致库和脚本之间的原型冲突(即restype、argtypes和errcheck)。使用msvcrt = ctypes.CDLL('msvcrt')。 -
另外,带一大粒盐的“灰帽蟒”。我已经看过许多基于该书代码的示例,足以知道它充满了随意忽略设置原型的代码,因此许多依赖于指针和模块句柄的代码在 64 位 Windows 中中断,或者正在做适当的错误检查,例如使用
WinDLL的use_last_error参数启用ctypes.get_last_error和ctypes.set_last_error(基于线程本地存储的安全GetLastError和SetLastError)。 -
我确实尝试了 python 站点
16.16. ctypes — A foreign function library for Python上显示的各种方法,例如create_string_buffer()和create_unicode_buffer(),并且可以使用原生 Pythonprint()让它们工作。也许最好坚持使用 2.7,尽管我确信我读过一篇文章说不再支持 2.7...