在Pyside中:QProcess.write(u'Test')返回0L

时间:2014-11-10 00:20:09

标签: python string unicode pyside qprocess

我的理解是在Pyside中QString已被删除。可以将Python字符串写入QLineEdit,当读取QLineEdit时,它将作为unicode字符串返回(每个字符16位)。

尝试将此字符串从我的Gui进程写入使用QProcess启动的子进程似乎不起作用,只返回0L(见下文)。如果使用str()函数将unicode字符串更改回Python字符串,则self.my_process.write(str(u'test'))现在返回4L。这种行为对我来说似乎不正确。

有人可以解释为什么QProcess.write()似乎不能用于unicode字符串吗?

(Pdb) PySide.QtCore.QString()
*** AttributeError: 'module' object has no attribute 'QString'
(Pdb) self.myprocess.write(u'test')
0L
(Pdb) self.myprocess.write(str(u'test'))
4L
(Pdb) 

1 个答案:

答案 0 :(得分:3)

PySide从未提供类似QString,QStringList,QVariant等的类。它总是与等效的python类型进行隐式转换 - 也就是说,在PyQt术语中,它只实现v2 API(参见{ {3}}了解更多详情。)

然而,与PyQt4相比,在尝试编写unicode字符串时,QProcess的行为在PySide中似乎有些破坏。这是PyQt4中的一个简单测试:

Python 2.7.8 (default, Sep 24 2014, 18:26:21) 
[GCC 4.9.1 20140903 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from PyQt4 import QtCore
>>> QtCore.PYQT_VERSION_STR
'4.11.2'
>>> p = QtCore.QProcess()
>>> p.start('cat'); p.waitForStarted()
True
>>> p.write(u'fóó'); p.waitForReadyRead()
3L
True
>>> p.readAll()
PyQt4.QtCore.QByteArray('f\xf3\xf3')

所以似乎PyQt会将unicode字符串隐式编码为' latin-1'在将它们传递给QProcess.write()之前(当然要求const char *QByteArray)。如果您需要不同的编码,则必须明确地完成:

>>> p.write(u'fóó'.encode('utf-8')); p.waitForReadyRead()
5L
True
>>> p.readAll()
PyQt4.QtCore.QByteArray('f\xc3\xb3\xc3\xb3')

现在让我们看看PySide会发生什么:

Python 2.7.8 (default, Sep 24 2014, 18:26:21) 
[GCC 4.9.1 20140903 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from PySide import QtCore, __version__
>>> __version__
'1.2.2'
>>> p = QtCore.QProcess()
>>> p.start('cat'); p.waitForStarted()
True
>>> p.write(u'fóó'); p.waitForReadyRead()
0L
^C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt

所以:没有隐式编码,而且进程只是阻塞而不是引发错误(这似乎是一个错误)。但是,使用显式编码重新尝试按预期工作:

>>> p.start('cat'); p.waitForStarted()
True
>>> p.write(u'fóó'.encode('utf-8')); p.waitForReadyRead()
5L
True
>>> p.readAll()
PySide.QtCore.QByteArray('fóó')