我写了一小段测试软件,其目标是通过子进程实际启动我的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
答案 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";
通过上述更改,代码可以正常使用。