当脚本从WIndows命令行运行时,不接受PyQt Qstring,为什么?

时间:2015-06-14 18:54:03

标签: python windows command-line pyqt4 qstring

在x64机器上使用PyQt 4,Python 2.7,Windows 7。

我一直在使用带有PyQt4的Python控制台开发一些代码,并使用module shape_mod type, abstract :: abstractshape integer :: color logical :: filled integer :: x integer :: y end type abstractshape interface abstractshape module procedure initShape end interface abstractshape type, EXTENDS (abstractshape) :: shape end type shape type, EXTENDS (shape) :: rectangle integer :: length integer :: width end type rectangle interface rectangle module procedure initRectangle end interface rectangle contains ! initialize shape objects subroutine initShape(this, color, filled, x, y) class(shape) :: this integer :: color logical :: filled integer :: x integer :: y this%color = color this%filled = filled this%x = x this%y = y end subroutine initShape ! initialize rectangle objects subroutine initRectangle(this, color, filled, x, y, length, width) class(rectangle) :: this integer :: color logical :: filled integer :: x integer :: y integer, optional :: length integer, optional :: width this%shape = shape(color, filled, x, y) if (present(length)) then this%length = length else this%length = 0 endif if (present(width)) then this%width = width else this%width = 0 endif end subroutine initRectangle end module shape_mod program test_oop use shape_mod implicit none ! declare an instance of rectangle type(rectangle) :: rect ! calls initRectangle rect = rectangle(2, .false., 100, 200, 11, 22) print*, rect%color, rect%filled, rect%x, rect%y, rect%length, rect%width end program test_oop

将字符串从QLineEdit()小部件传递到OS命令而没有问题

但是当我尝试从Windows命令行运行时出现以下错误,

  

TypeError:序列项0:期望字符串,找到QString

我通过os.system(cmd)转换有问题的字符串来解决这个问题,但这让我很好奇,为什么只有在从命令行调用代码而不是在Python控制台中调用代码时才会发生这种情况? / p>

2 个答案:

答案 0 :(得分:2)

我不确定为什么会发生这种情况(假设你只是使用标准的Python控制台),但是可以配置PyQt方法来返回python字符串而不是QStrings。我怀疑你的Python控制台正在这样做,但你的脚本却没有。同样,我真的不明白为什么普通的python控制台会自动执行此操作,除非我们对普通python控制台的定义有所不同(通过普通控制台我的意思是从终端运行python.exe)。但是,这是我在控制台中实际运行不同代码而没有实现的唯一解释。

因此,PyQt documentation介绍了如何使用QStrings模块禁用sip。您只需 导入PyQt4。

import sip
sip.setapi('QString', 2)

如果在Python脚本中执行此操作,则应在控制台和命令行之间获得相同的行为。

您也可以执行类似的操作来禁用QVariant以及其他令人烦恼的Qt类型,这些类型在Python中通常毫无意义。

答案 1 :(得分:-1)

我认为发生这个问题是因为命令行参数实际上是字节数组而不是字符串,字符串是用Unicode编码的,但是字节数组不是。调用str(cmd)会将cmd的内容作为字符串返回。