python — Qt — Как написать & quot; more & quot; данные в QProcess?

Я столкнулся с проблемой, с которой я сталкивался несколько раз.
Вопрос каждый раз решается сам по себе, и я не понимаю, что его вызывает.
Так что получается, что я запускаю виртуальную среду Python из своего кода на C ++. Это работает, впоследствии с помощью функции записи я могу писать вещи в этой среде. Это также прекрасно работает до сих пор. Однако я не могу написать свою последнюю команду в процессе.
Я думал о том, что, возможно, какой-то буфер заполнен, но я не нашел ничего о буфере в документации Qt.

Это соответствующий кусок кода:

static QStringList params;
QProcess *p = new QProcess();

params<<"-f"<<"-c"<<"python2"<< "/home/John/Desktop/python.log";
qDebug()<<"parameters: "<<params;

qDebug()<<"going to write";
p->start("script", params);
qDebug()<<"Turning on new user process...";
while(!p->waitForStarted())
{qDebug()<<"waiting for virtualenv to be ready";}
successFailWrite = p->write("import imp;\n");
while(!p->waitForBytesWritten());
successFailWrite = p->write("foo = imp.load_source('myTest', '/home/John/recognitionClass.py');\n");
while(!p->waitForBytesWritten());
successFailWrite = p->write("from myTest import recognitionClass;\n");
while(!p->waitForBytesWritten());
successFailWrite = p->write("myClassObj = recognitionClass();\n");
if(successFailWrite !=-1)
{qDebug()<<"OK written";}
while(!p->waitForBytesWritten());
successFailWrite = p->write("habelahabela\n");
if(successFailWrite !=-1)
{qDebug()<<"OK written";}

QString name = "John";
QString processNewUserParameter= "print myClassObj.addNewUser("+ name +");\n";
QByteArray processNewUserParameterByteArr= processNewUserParameter.toUtf8();
p->write(processNewUserParameterByteArr);

Я храню файл журнала, который содержит то, что записывается в python virtualenv и что печатается

Script started on Son 27 Aug 2017 20:09:52 CEST
import imp;
foo = imp.load_source('myTest', '/home/John/recognitionClass.py');
from myTest import recognitionClass;
myClassObj = recognitionClass();
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.
>>> import imp;
>>> foo = imp.load_source('myTest', '/home/John/recognit
<myTest', '/home/John/recogniti                         onClass.py');
/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
"This module will be removed in 0.20.", DeprecationWarning)
/usr/local/lib/python2.7/dist-packages/sklearn/grid_search.py:43: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. This module will be removed in 0.20.
DeprecationWarning)
>>> from myTest import recognitionClass;
>>> myClassObj = recognitionClass();
>>>

Он не выводит дважды «ОК написано», что с одной стороны доказывает, что я успешно записал свои команды в процесс, но я ничего не вижу.

Как видите, тестовое предложение «хабелахабела» тоже не написано.
У кого-нибудь есть представление о том, что я могу делать неправильно?
Я знаю, что я пишу свои команды, чтобы быстро в окружающую среду. Потому что, как вы можете видеть, я начинаю с написания «import imp», затем он буферизируется, и чуть позже буфер очищается, и virtualenv выполняет команду (вот почему вы видите это дважды).

Кто-нибудь понимает, почему я не вижу тестовое предложение и, что более важно, мою настоящую команду? "print myClassObj.addNewUser("+ name +");\n" печататься в виртуальной среде?

Спасибо

2

Решение

Прежде всего, нет смысла писать while(!p->waitForBytesWritten());, waitForBytesWritten уже блокирует вашу ветку без while цикл и, как следует из названия, ждет, пока не будут записаны байты. Возвращается false только если есть или тайм-аут или ошибка. В первом случае вы должны дать ему больше времени для записи байтов. Во втором случае вы должны исправить ошибку и только потом повторить попытку.
То же самое относится и к waitForStarted и все другие функции Qt, начинающиеся с «waitFor …».

Таким образом, использование выглядит так:

if(!p->waitForBytesWritten(-1)) // waits forever until bytes ARE written
{
qDebug() << "Error while writing bytes";
}

По вопросу: Я считаю, что проблема (или, по крайней мере, ее часть) заключается в том, что вы пишете последние 2 сообщения в pно ты тоже не ждешь bytesWritten() сигнал, ни использовать waitForBytesWritten() функция блокировки. Хотя, вероятно, ошибки не происходит (потому что p->write(...) не возвращает -1 в этот момент), однако это не означает, что ваше сообщение еще написано. В двух словах, подождите bytesWritten() сигнал…

QProcess наследуется от QIODeviceтак что рекомендую посмотреть его документы и узнать об этом немного больше.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]