• 13731阅读
  • 7回复

[提问]关于Qprocess读取输出的问题 [复制链接]

上一主题 下一主题
离线yysniper
 

只看楼主 倒序阅读 楼主  发表于: 2014-02-04
我在其他论坛的提问,但是未得到解决:
我在使用QProcess时,读取如cmd命令dir之类的可以读取到输出,但是我在读取长期运行,并且随时会产生输出的其他程序时却不能实时读取到程序的输出,请问如何做才能读取到程序的实时输出?
好吧,我再说清楚点:
我想通过QProcess调用python命令行,然后获取道python交互式命令行的输出,就像是在cmd中调用python一样的效果。可是我如论如何都无法读取到python交互式命令行的输出,貌似python的输出不是在标准输出中,请知道的给点意见吧


好吧,问题解决了。求助于google的英文搜索,在这里http://stackoverflow.com/questio ... sole-using-qprocess找到了,原来需要在python后加一个-i,也就是python -i就可以了。我查看了python的帮助,对于-i的解释是,对于标准输入不是终端的情况下,依然强制输出提示。
也就是,我用QProcess调用python,python检测到运行自身的不是一个终端,于是就关闭了提示的输出,所有使用QProcess的readAll或者readAllStandarOutput()是读不到信息的。


问题又来了,虽然在python后加了-i可以正常显示python交互式命令的输出,但是我在运行django的启动服务命令时也就是python -i manage.py runserver时,并没有读到输出,为什么啊啊啊啊啊啊啊啊啊啊啊啊啊


其实最终目的是做一个类似于微软CMD的一个终端!!!
为技术而生
离线noidea

只看该作者 1楼 发表于: 2014-02-04
你的运行环境是?Qt版本,操作系统?

你的问题应该是进程间同步问题。

请判别:
1. 判断输出渠道,是stdout还是stderr?
2. 同步你的process,是否有用到下边的方法?

  1. waitForStarted()   // blocks until the process has started.
  2. waitForReadyRead()   // blocks until new data is available for reading on the current read channel.
  3. waitForBytesWritten()   //blocks until one payload of data has been written to the process.
  4. waitForFinished()  // blocks until the process has finished.


文档:http://qt-project.org/doc/qt-5.0/qtcore/qprocess.html#details

Good Luck

PS:
  1. -i     : inspect interactively after running script; forces a prompt even
  2.          if stdin does not appear to be a terminal; also PYTHONINSPECT=x


还有一种方法就是你的python脚本负责创建FIFO ,然后每次python有输出的时候就往FIFO里边写,Qt监视FIFO就行了。
这个方法我曾经有做过,这个case有点小复杂,你可以酌情考虑一下。

如果你问题还是没有解决,可以提供最简的例子,可以更好的帮你排查问题。
talk in code
Qt5.2.1 + MacOSX10.9
离线yysniper

只看该作者 2楼 发表于: 2014-02-04
回 noidea 的帖子
Qt5.2+win7
问题1:我stdout和stderr都试过了
问题2:同步process我做了,我用信号与槽做的,那几个wait函数容易导致界面假死

能否将你的case提供借鉴下,不过我只是想实现一个终端的功能,对python脚步不做更改的。就像在cmd中执行python manage.py runserver就很好,而不用对脚步做更改
为技术而生
离线noidea

只看该作者 3楼 发表于: 2014-02-04
Re:关于Qprocess读取
文档中说明这些函数会block,所以你可能需要做一个线程来一直监视你的python脚本。

fifo适用于*nix环境,如果是windows估计就没法用了。
talk in code
Qt5.2.1 + MacOSX10.9
离线noidea

只看该作者 4楼 发表于: 2014-02-04
回 yysniper 的帖子
yysniper:Qt5.2+win7
问题1:我stdout和stderr都试过了
问题2:同步process我做了,我用信号与槽做的,那几个wait函数容易导致界面假死
能否将你的case提供借鉴下,不过我只是想实现一个终端的功能,对python脚步不做更改的。就像在cmd中执行python manage.py runserver就很好,而不用对脚 .. (2014-02-04 11:39) 

如果只是执行这个命令就不需要同步啊,你可以设置为后台运行。我之前理解你需要获得脚本的输出。
talk in code
Qt5.2.1 + MacOSX10.9
离线noidea

只看该作者 5楼 发表于: 2014-02-05
回 yysniper 的帖子
yysniper:Qt5.2+win7
问题1:我stdout和stderr都试过了
问题2:同步process我做了,我用信号与槽做的,那几个wait函数容易导致界面假死
能否将你的case提供借鉴下,不过我只是想实现一个终端的功能,对python脚步不做更改的。就像在cmd中执行python manage.py runserver就很好,而不用对脚 .. (2014-02-04 11:39) 

还一个问题可能是buffer,你在python后边加一个参数-u试试看。
talk in code
Qt5.2.1 + MacOSX10.9
离线yysniper

只看该作者 6楼 发表于: 2014-02-06
回 noidea 的帖子
noidea:还一个问题可能是buffer,你在python后边加一个参数-u试试看。 (2014-02-05 16:20) 

试过了,不好使。为什么windows的command.com就可以直接读取并显示呢。有没有类似的用Qt实现的模拟cmd工程
为技术而生
离线noidea

只看该作者 7楼 发表于: 2014-02-06
那剩下的就只能排查程序了,看看是不是python里边的输出被重定向了。
talk in code
Qt5.2.1 + MacOSX10.9
快速回复
限100 字节
 
上一个 下一个