相关疑难解决方法(0)

如何以"正确"的方式处理具有空字节的Python unicode字符串?

似乎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 …

python unicode winapi pywin32

10
推荐指数
1
解决办法
4835
查看次数

C,C++与Python的接口

我的c ++代码已成长为指数级.我有很多变量(大多数是布尔值),每次运行我的代码时都需要更改(不同的运行条件).我使用main( int argc, char* argv[])过去的函数的参数命令行输入完成了这个.

由于这种方法已经成为累赘(I有18种不同的运行条件下,因此,18个不同的参数:-(),我想移动到与Python接口(如果需要的话击).理想情况下,我想编码Python脚本,其中我设置数据成员的值,然后运行代码.

有没有人有任何可以帮助我的指针/信息?更好的是我可以查找一个简单的编码示例或URL.

从原始问题编辑:

对不起,我不认为我对我的问题很清楚.我不想main( int argc, char* argv[])在c ++中使用该功能.而不是在命令行上设置变量.我可以使用python来声明和初始化我的c ++代码中的数据成员吗?

再次感谢迈克

c c++ python bash

5
推荐指数
2
解决办法
4612
查看次数

标签 统计

python ×2

bash ×1

c ×1

c++ ×1

pywin32 ×1

unicode ×1

winapi ×1