我正在使用CreateProcessWithLogonW的ctypes实现,一切正常,但我无法弄清楚如何处理这一部分:
指向新进程的环境块的指针.如果此参数为NULL,则新进程使用调用进程的环境.
环境块由以null结尾的以null结尾的字符串块组成.每个字符串采用以下形式:
名=值\ 0
要生成原始字符串,我执行以下操作:
lpEnvironment = '\0'.join(['%s=%s' % (k, os.environ[k]) for k in os.environ]) + '\0\0'
print lpEnvironment
'XAUTHORITY=/home/username/.Xauthority\x00MUTT_DIR=/home/username/.mutt\x00LASTDIRFILE=/home/username/.lastpwd-geany\x00LOGNAME=username\...\x00\x00'
Run Code Online (Sandbox Code Playgroud)
然而,我运行了一个ctypes变量,它截断了信息:
ctypes.c_wchar_p(lpEnvironment)
c_wchar_p(u'XAUTHORITY=/home/username/.Xauthority')
Run Code Online (Sandbox Code Playgroud)
如何正确传递lpEnvironment信息?
据我所知,整个字符串确实ctypes在一个方向正确地穿过边界,但在回来的路上被截断.
>>> ctypes.create_string_buffer('abc\0def').value
'abc'
>>> ctypes.create_string_buffer('abc\0def').raw
'abc\x00def'
Run Code Online (Sandbox Code Playgroud)
不幸的是(至少对我来说,Linux上的Python 2.6.5)结果create_unicode_buffer没有.raw属性.然而,
>>> ctypes.wstring_at(ctypes.create_unicode_buffer(u'abc\0def), 7)
u'abc\x00def'
Run Code Online (Sandbox Code Playgroud)
按预期工作.