Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QProcess正在执行python3脚本,但工作不正常_Python_C++_Qt_Qt5_Qprocess - Fatal编程技术网

QProcess正在执行python3脚本,但工作不正常

QProcess正在执行python3脚本,但工作不正常,python,c++,qt,qt5,qprocess,Python,C++,Qt,Qt5,Qprocess,我在执行QProcess中的python3脚本时遇到此问题。python脚本正在从秒到秒打印时间,它在命令行中运行良好。在Qt中,信号readyReadStandardOutput()连接到一个插槽,在该插槽中调用readAllStandardOutput()从脚本读取标准输出问题是插槽只调用一次它只打印一次时间,然后不再打印。QProcess的状态保持在“正在运行”状态。永远不会调用readyReadStandardError()和错误(QProcess::ProcessError)信号 为什

我在执行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_进程=新的QProcess(本);
连接(m_进程、信号(readyReadStandardOutput())、此、插槽(onTest());
连接(m_进程、信号(readyReadStandardError())、此、插槽(ontester());
连接(m_进程,信号(错误(QProcess::ProcessError)),此,插槽(ontester());
连接(m_进程,信号(stateChanged(QProcess::ProcessState)),这个,插槽(onTestState());
startProcess();
}
void MClass::startProcess()
{
QString脚本=“../../python/test.py”;
QString pythonCommand=“python3”+脚本;
printf(“PyCommand:%s\n”,pythonCommand.toStdString().c_str());
m_进程->启动(Python命令);

//m_process->start(“python3”,QStringList()我认为问题在于python对标准输出的处理。我尝试了以下脚本:

def foo():
    #print(time.ctime())
    sys.stdout.write(time.ctime()) 
    sys.stdout.write("\n")
    sys.stdout.flush()
    threading.Timer(1, foo).start()
我用
sys.stdout.write
替换了
print
,结果成功了。我认为真正起作用的是调用
flush

换句话说,您的脚本将永远运行,因此标准输出永远不会刷新。如果您尝试其他脚本,该脚本将在五次迭代后结束:

def bar():    
    x = 0      
    while x < 5:
        print(time.ctime())
        time.sleep(1)
        x = x + 1
def bar():
x=0
当x<5时:
打印(time.ctime())
时间。睡眠(1)
x=x+1

在Qt应用程序中,您将在五秒钟后看到整个输出。

我认为问题在于python对标准输出的处理。我尝试了以下脚本:

def foo():
    #print(time.ctime())
    sys.stdout.write(time.ctime()) 
    sys.stdout.write("\n")
    sys.stdout.flush()
    threading.Timer(1, foo).start()
我用
sys.stdout.write
替换了
print
,结果成功了。我认为真正起作用的是调用
flush

换句话说,您的脚本将永远运行,因此标准输出永远不会刷新。如果您尝试其他脚本,该脚本将在五次迭代后结束:

def bar():    
    x = 0      
    while x < 5:
        print(time.ctime())
        time.sleep(1)
        x = x + 1
def bar():
x=0
当x<5时:
打印(time.ctime())
时间。睡眠(1)
x=x+1

在Qt应用程序中,您将在五秒钟后看到整个输出。

我们可以看到您的python脚本吗?它是一个交互式脚本,即您是否从标准输入中读取?这可能解释了进程保持运行的原因。@jbh python脚本在Qt之上code@IspasClaudiu如果只调用readAllStandardOutput,去掉while循环和witho,会怎么样ut测试canReadLine()?@S.monteleon这没有任何区别。在我看来,这种行为的原因是只有第一次打印在主线程中执行,其他打印在其他线程中执行。我们可以看到您的python脚本吗?它是一个交互式脚本,即您是否从标准输入中读取?这可能解释了为什么进程保持运行。@jbh python脚本位于qt之上code@IspasClaudiu如果只调用readAllStandardOutput,去掉while循环,不测试canReadLine()会怎么样?@S.monteleon这没有任何区别。在我看来,这种行为的原因是只有第一次打印在主线程中执行,其他的在其他线程中执行。是的,这是一个刷新问题。您的代码可以工作,但是在true上使用flash标志进行打印也可以完成工作:
print(“msg:”,end='\n',file=sys.stdout,flush=True)
是的,这是一个刷新问题。但是,您的代码也可以使用True上的flash标志进行打印:
打印(“msg:,end='\n',file=sys.stdout,flush=True)