我遇到此问题从QProcess执行python3脚本。 python脚本将时间从秒打印到秒,从命令行正常工作。在Qt中,信号readyReadStandardOutput()连接到一个槽,其中调用readAllStandardOutput()以从脚本读取标准输出。 问题是只调用一次插槽!它会打印一次,然后不再打印。 QProcess的状态仍处于“正在运行”状态。从不调用readyReadStandardError()和错误(QProcess :: ProcessError)信号。
为什么每次调用时只调用一次插槽?感谢
Python脚本:
import time, threading
def foo():
print(time.ctime())
threading.Timer(1, foo).start()
foo()
Qt的:
MClass::MClass(QObject* parent)
{
m_process = new QProcess(this);
connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(onTest()));
connect(m_process, SIGNAL(readyReadStandardError()), this, SLOT(onTestErr()));
connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onTestErr()));
connect(m_process, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(onTestState()));
startProcess();
}
void MClass::startProcess()
{
QString script= "../../python/test.py";
QString pythonCommand = "python3 " + script;
printf("PyCommand: %s\n", pythonCommand.toStdString().c_str());
m_process->start(pythonCommand);
// m_process->start("python3", QStringList()<<script);
}
}
void MClass::onTest()
{
qDebug()<<"------------------ON TEST";
while(m_process->canReadLine())
{
qDebug()<<m_process->readAllStandardOutput();
}
}
void MClass::onTestErr()
{
qDebug()<<"------------------ON ERR: " << m_process->errorString();
}
void MClass::onTestState()
{
qDebug()<<"------------------ STATE CHANGED: " << m_process->state();
}
答案 0 :(得分:1)
我认为问题在于python处理标准输出。我试过这个剧本:
def foo():
#print(time.ctime())
sys.stdout.write(time.ctime())
sys.stdout.write("\n")
sys.stdout.flush()
threading.Timer(1, foo).start()
我用print
代替sys.stdout.write
并且它有效。我认为真正有所作为的是对flush
的呼唤。
换句话说,您的脚本将永远运行,因此标准输出永远不会被刷新。如果你尝试这个在五次迭代后结束的其他脚本:
def bar():
x = 0
while x < 5:
print(time.ctime())
time.sleep(1)
x = x + 1
在Qt应用程序中,您将在五秒钟后看到整个输出。