题
似乎PyWin32很容易将以null结尾的unicode字符串作为返回值.我想以'正确'的方式处理这些字符串.
假设我得到一个字符串:u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'.这似乎是在Python unicode对象中挂出的C样式的以null结尾的字符串.我想把这个坏男孩修剪成一个常规的字符串,例如,我可以在窗口标题栏中显示.
在第一个空字节处修剪字符串是否正确处理它?
我没想到得到这样的返回值,所以我想知道我是否遗漏了一些关于Python,Win32和unicode如何一起玩的重要内容......或者这是否只是一个PyWin32错误.
背景
我正在使用GetOpenFileNameWPyWin32包中的Win32文件选择器函数.根据文档,此函数返回一个包含完整文件名路径的元组作为Python unicode对象.
当我打开具有现有路径和文件名集的对话框时,我得到一个奇怪的返回值.
例如,我将默认设置为: C:\\Users\\Guest\\MyFileIsReallyReallyReallyAwesome.asy
在对话框中,我将名称更改为MyFile.asy并单击"保存".
返回值的完整路径部分是:u'C:\ Users\Guest\MyFile.asy\x00wesome.asy'`
我期望它是: u'C:\\Users\\Guest\\MyFile.asy'
该函数返回一个循环缓冲区而不删除终止字节.不用说,我的其余代码没有设置为处理C样式的以null结尾的字符串.
演示代码
以下代码演示了GetSaveFileNameW返回值中以null结尾的字符串.
方向:在对话框中将文件名更改为"MyFile.asy",然后单击"保存".观察打印到控制台的内容.我得到的输出是u'C:\\Users\\Guest\\MyFile.asy\x00wesome.asy'.
import win32gui, win32con
if __name__ == "__main__":
initial_dir = 'C:\\Users\\Guest'
initial_file = 'MyFileIsReallyReallyReallyAwesome.asy'
filter_string = 'All Files\0*.*\0'
(filename, customfilter, flags) = \
win32gui.GetSaveFileNameW(InitialDir=initial_dir,
Flags=win32con.OFN_EXPLORER, File=initial_file,
DefExt='txt', Title="Save As", Filter=filter_string,
FilterIndex=0)
print repr(filename)
Run Code Online (Sandbox Code Playgroud)
注意:如果您没有足够缩短文件名(例如,如果您尝试MyFileIsReally.asy),则字符串将在没有空字节的情况下完成.
环境
Windows 7 Professional 64位(无服务包),Python 2.7.1,PyWin32 Build 216
更新:PyWin32 Tracker神器
基于我到目前为止收到的评论和答案,这可能是一个pywin32错误,所以我提交了一个跟踪器工件.
更新2:修复!
Mark Hammond在追踪器工件中报告说这确实是一个错误.一个修复程序已检入rev f3fdaae5e93d,所以希望这将成为下一个版本.
我认为Aleksi …
我的c ++代码已成长为指数级.我有很多变量(大多数是布尔值),每次运行我的代码时都需要更改(不同的运行条件).我使用main( int argc, char* argv[])过去的函数的参数命令行输入完成了这个.
由于这种方法已经成为累赘(I有18种不同的运行条件下,因此,18个不同的参数:-(),我想移动到与Python接口(如果需要的话击).理想情况下,我想编码Python脚本,其中我设置数据成员的值,然后运行代码.
有没有人有任何可以帮助我的指针/信息?更好的是我可以查找一个简单的编码示例或URL.
从原始问题编辑:
对不起,我不认为我对我的问题很清楚.我不想main( int argc, char* argv[])在c ++中使用该功能.而不是在命令行上设置变量.我可以使用python来声明和初始化我的c ++代码中的数据成员吗?
再次感谢迈克