Qt C ++ - 如何成功将数据传递给子进程?

时间:2017-08-17 09:40:57

标签: python c++ qt

我写了一小段测试软件,其目标是通过子进程实际启动我的python虚拟环境并在该进程中执行一些命令。似乎子进程从未接收到数据。

下面的代码做了两件事:传递数据,即字符串" John"每次传递字符串时,子进程和读取日志文件(以检查命令是否被正确理解)。

在我的终端中输入此内容(我故意执行不正确的命令以进行测试):

   $ script -f -c python2 python.log
   Script started, file is python.log
   Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
   [GCC 5.4.0 20160609] on linux2
   Type "help", "copyright", "credits" or "license" for more information.
   >>> John
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   NameError: name 'John' is not defined

我的python.log文件现在包含(按预期和需要):

   Script started on Don 17 Aug 2017 01:04:54 CEST
   Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
   [GCC 5.4.0 20160609] on linux2
   Type "help", "copyright", "credits" or "license" for more information.
   >>> John
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   NameError: name 'John' is not defined
   >>> 

应该复制此行为的相应代码:

按下gui上的按钮时,执行此代码:

    void MainWindow::mainFunction()
   {
       QFile myfile("/home/John/Desktop/python.log");
       QTextStream input(&myfile);
       if(!myfile.open(QIODevice::ReadOnly)) {
           QMessageBox::information(0, "error", myfile.errorString());
       }

       QProcess p;    //childprocess
       QStringList params;
       qint64 successFailWrite;
       qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
       connect(&p, &QProcess::errorOccurred, qApp, &QApplication::aboutQt );
       //connect(&p, &QProcess::started, qApp, &QApplication::aboutQt);
       params<<"-f"<<"-c"<<"python2 python.log";
       qDebug()<<"parameters: "<<params;
       p.start("script", params);
       while(!p.waitForStarted())
       {qDebug()<<"waiting for started";}


       while(1)
       {
           successFailWrite = p.write("John", 1);

           while(!input.atEnd())
           {
               QString line = input.readLine();
               qDebug()<<"read: "<<line;
           }
       }
   }

执行此代码时,我的python.log文件始终为空,但successFailWrite变量为1,这意味着它必须将字符串写入进程。同样奇怪的是,当我替换

       p.start("script", params); 

with:p.start(&#34; scriptttt&#34;,params);

没有任何变化,aboutQt SLOT没有被激活,我无法在任何地方看到任何错误信息。 According to the Qt documents I should be able to interface with my process using write() just like an IODevice

我做错了什么?

编辑:参数&lt;&lt;&#34; -f&#34;&lt;&lt;&#;&#34; -c&#34;&lt;&lt;&#;; python2&#34; &LT;&LT;&#34; python.log&#34 ;;并不工作。

但是我可以看到,当我的代码被执行时会发生这种情况:

$ ps aux | grep python

John+  7436  0.0  0.0  22352  2716 ?        S    11:56   0:00 script -f -c python2 python.log
John+  7437  0.5  0.1  31648  6924 pts/20   Ss+  11:56   0:00 python2
John+  7439  0.0  0.0  14540  1020 pts/0    S+   11:56   0:00 grep --color=auto python

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。首先,正如评论中所指出的,以下代码......

p.write("John", 1);

只会写一个字符。由于你有一个空终止字符串,只需使用接受它的QIODevice::write重载并记住包含换行符...

p.write("John\n");

更重要的是,你有......

params << "-f" << "-c" << "python2 python.log";

你需要拆分“python2 python.log” - 这是两个独立的参数。尝试...

params << "-f" << "-c" << "python2" << "python.log";

通过上述更改,代码可以正常使用。