Home · All Classes · Modules · QSS HELP · QSS 案例 · VER007 HOME |
使用QProcess类,用来启动外部程序,并与他们沟通。More...
继承QIODevice。
使用QProcess类,用来启动外部程序,并与他们沟通。
要启动一个过程,传递你想要作为参数来运行程序的名称和命令行参数start( ) 。参数被作为一个单独的字符串QStringList。
例如,下面的代码片段使含有“风格”和“主题”中的参数列表中两个项目的字符串运行在X11平台上的Motif风格的模拟时钟的例子:
QObject *parent; ... QString program = "./path/to/Qt/examples/widgets/analogclock"; QStringList arguments; arguments << "-style" << "motif"; QProcess *myProcess = new QProcess(parent); myProcess->start(program, arguments);
另外,QProcess然后进入Starting状态,当程序已经启动,另外,QProcess进入Running状态并发出started( ) 。
另外,QProcess允许你把一个进程顺序I / O设备。你可以写信给从进程读取,就像您使用访问网络连接QTcpSocket。然后,您可以通过调用写入进程的标准输入write( ) ,并通过调用读取标准输出read( )readLine()和getChar( ) 。因为它继承QIODevice,另外,QProcess也可以被用作输入源QXmlReader或者,用于产生数据,以使用被上传QFtp。
Note:在VxWorks中, Windows CE和Symbian的,读取和写入的过程是不支持。
当进程退出,另外,QProcess重新进入NotRunning状态(初始状态) ,并且发射finished( ) 。
该finished( )信号提供了退出代码和过程作为参数退出状态,您也可以致电exitCode()来获取完成的最后一个进程的退出代码,exitStatus()来获取它的退出状态。如果发生在任何时间点的误差,另外,QProcess将发出的error()信号。您也可以拨打error()找到最后发生的错误的类型,state()找到当前进程的状态。
流程有两个预定义的输出通道:标准输出通道(stdout)定期提供控制台输出,标准错误通道(stderr)通常提供了由印刷过程中的错误。这些通道代表两个独立的数据流。你可以通过调用它们之间进行切换setReadChannel( ) 。另外,QProcess发出readyRead( )时,数据可在当前的读通道。它还发出readyReadStandardOutput()时,新的标准输出数据是可用的,并且当新的标准误差数据是可用的,readyReadStandardError()被发射。而不是调用read( )readLine() ,或getChar( ) ,您也可以通过调用读取无论是从两个通道的所有数据readAllStandardOutput()或readAllStandardError( ) 。
该术语的渠道可能会产生误导。请注意,该过程的输出通道对应QProcess中的read通道,而这个过程的输入通道对应QProcess中的write频道。这是因为我们阅读使用QProcess中什么是过程的输出,而我们写什么成为过程的输入。
另外,QProcess可以合并两个输出通道,使标准输出,并从运行中的进程的标准误差数据两者都使用标准的输出通道。通话setProcessChannelMode( )与MergedChannels在开始之前,过程中activative此功能。你还可以在转发运行过程的输出到调用,主处理的选项,通过使ForwardedChannels作为参数。
某些过程中为了操作需要特殊环境设置。你可以通过调用设置环境变量为你的进程setEnvironment( ) 。要设置一个工作目录,呼叫setWorkingDirectory( ) 。默认情况下,进程在调用进程的当前工作目录运行。
Note:在VxWorks中,通过渠道与进程进行通信,不支持。
Note:在Symbian ,设置环境或工作目录是不支持。该工作目录将永远是正在运行的进程的私有目录。
Note:QNX的,设置工作目录可能会导致所有应用程序线程,除了使用QProcess调用者线程的,暂时冻结,由于在操作系统的限制。
另外,QProcess提供了一组功能,允许它被用于没有一个事件循环,通过挂起调用线程,直到某个信号发出:
从主线程(即调用线程调用这些函数QApplication.exec( ) )可能会导致你的用户界面冻结。
下面的示例运行gzip压缩字符串“ Qt的岩石! ”无事件循环:
QProcess gzip; gzip.start("gzip", QStringList() << "-c"); if (!gzip.waitForStarted()) return false; gzip.write("Qt rocks!"); gzip.closeWriteChannel(); if (!gzip.waitForFinished()) return false; QByteArray result = gzip.readAll();
有些Windows的命令(例如,dir)不提供单独的应用程序,而由命令解释程序本身。如果您尝试使用QProcess中直接执行这些命令,它不会工作。一个可能的解决方案是要执行的命令解释器本身(cmd.exe在某些Windows系统) ,并要求执行所需的命令解释器。
另外,QProcess支持仅适用于RTP模式,并且只提供了有限的功能。当使用QProcess中启动Qt应用程序,启动的应用程序都必须有下面的代码:
这个枚举变量描述了不同的退出状态QProcess。
Constant | Value | Description |
---|---|---|
QProcess.NormalExit | 0 | 这个过程正常退出。 |
QProcess.CrashExit | 1 | 该进程崩溃。 |
See also exitStatus( ) 。
该枚举描述了所使用的运行过程中的工艺通道。通过这些值之一setReadChannel()设定的当前的读通道QProcess。
Constant | Value | Description |
---|---|---|
QProcess.StandardOutput | 0 | 正在运行的进程的标准输出(stdout ) 。 |
QProcess.StandardError | 1 | 正在运行的进程的标准错误(错误) 。 |
See also setReadChannel( ) 。
这个枚举变量描述的过程通道模式QProcess。通过这些值之一setProcessChannelMode( )来设置当前的读通道模式。
Constant | Value | Description |
---|---|---|
QProcess.SeparateChannels | 0 | QProcess管理正在运行的进程的输出,保持标准输出和标准错误的数据在单独的内部缓冲区。您可以选择QProcess通过调用目前的读取通道setReadChannel( ) 。这是缺省信道模式QProcess。 |
QProcess.MergedChannels | 1 | QProcess合并运行过程中的输出到标准输出通道(stdout) 。标准错误通道(stderr)将不会收到任何数据。标准输出和正在运行的进程的标准错误数据交错。 |
QProcess.ForwardedChannels | 2 | QProcess运行过程中的转发到主处理的输出。任何事物的子进程写入其标准输出和标准错误将被写入标准输出和标准错误的主要过程。 |
See also setProcessChannelMode( ) 。
这个枚举变量描述了不同类型的错误报告由QProcess。
Constant | Value | Description |
---|---|---|
QProcess.FailedToStart | 0 | 该进程无法启动。无论是调用的程序丢失,或者您可能没有足够的权限来调用该程序。 |
QProcess.Crashed | 1 | 该工艺成功地坠毁后,开始一段时间。 |
QProcess.Timedout | 2 | 最后WAITFOR ... ( )函数超时。状态QProcess是不变的,你可以尝试调用WAITFOR ... ( )一次。 |
QProcess.WriteError | 4 | 试图写入过程时发生错误。例如,该过程可能未运行,或者它可能已经关闭了其输入通道。 |
QProcess.ReadError | 3 | 试图从进程读取时发生错误。例如,程序可能无法运行。 |
QProcess.UnknownError | 5 | 发生未知错误。这是默认的返回值error( ) 。 |
See also error( ) 。
该枚举描述的不同状态QProcess。
Constant | Value | Description |
---|---|---|
QProcess.NotRunning | 0 | 该进程不运行。 |
QProcess.Starting | 1 | 该过程开始,但该程序尚未被调用。 |
QProcess.Running | 2 | 该进程正在运行,并已准备好进行读取和写入。 |
See also state( ) 。
该parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。
构造一个QProcess与给定对象parent。
从重新实现QIODevice.atEnd( ) 。
返回True如果进程不运行,并没有更多的数据可供读取,否则返回False 。
从重新实现QIODevice.bytesAvailable( ) 。
从重新实现QIODevice.bytesToWrite( ) 。
从重新实现QIODevice.canReadLine( ) 。
此功能可在当前的读通道。
See also readChannel()和setReadChannel( ) 。
从重新实现QIODevice.close( ) 。
关闭所有与沟通的过程中,并杀死它。调用此函数后,QProcess将不再放出readyRead()和数据无法再被读取或写入。
关闭读取通道channel。调用此函数后,QProcess将不再接收该通道上的数据。已接收到的任何数据仍然可以读取。
调用这个函数来节省内存,如果你不感兴趣,这个过程的输出。
See also closeWriteChannel()和setReadChannel( ) 。
附表的写通道QProcess被关闭。所有数据已被写入的过程中的信道将关闭一次。调用该函数后,任何试图写入过程将失败。
关闭写通道是必要的读取输入数据,直到该通道已被关闭的程序。例如,程序“更”是用来在Unix和Windows控制台显示文本数据。但它不会显示文本数据,直到QProcess' s的写入通道已经关闭。例如:
QProcess more; more.start("more"); more.write("Text to display"); more.closeWriteChannel(); // QProcess will emit readyRead() once "more" starts printing
写通道被隐含地打开时start()被调用。
See also closeReadChannel( ) 。
此功能已被弃用。
返回环境,QProcess启动进程的时候,还是一个空将使用QStringList如果没有环境一直使用设置setEnvironment()或setEnvironmentHash () 。如果没有环境已被设置,则调用进程的环境将被使用。
Note:环境设置将被忽略在Windows CE和Symbian ,因为有一个环境的概念。
See also processEnvironment( )setEnvironment()和systemEnvironment( ) 。
返回上次发生错误的类型。
See also state( ) 。
启动程序program与参数arguments在一个新的进程,等待它完成,然后返回该进程的退出代码。新进程写入控制台的任何数据转发到调用进程。
环境和工作目录是从调用进程继承。
在Windows上,包含空格的参数被包装在引号中。
如果进程不能启动,则返回-2。如果进程崩溃,则返回-1。否则,将返回进程的退出代码。
这是一个重载函数。
启动程序program在一个新的进程。program是一个同时包含程序名和参数单个文本字符串。该参数由一个或多个空格隔开。
返回完成的最后一个进程的退出代码。
返回完成的最后一个进程的退出状态。
在Windows上,如果该进程是从另一个应用程序终止TerminateProcess ( )这个函数仍然会返回NormalExit除非退出代码小于0 。
这个函数是Qt 4.1中引入。
从重新实现QIODevice.isSequential( ) 。
这种方法也是一个Qt槽与C + +的签名void kill()。
杀死当前进程,使其立即退出。
在Windows上,杀()使用TerminateProcess ,并在Unix和Mac OS X上, SIGKILL信号发送到进程。
在Symbian ,此功能需要平台的安全能力PowerMgmt。如果不存在,该过程将恐慌与KERN - EXEC 46 。
Note:杀死其他进程正在运行的进程通常会导致Symbian的恐慌,由于平台的安全性。
See also Symbian Platform Security Requirements和terminate( ) 。
返回运行过程中本机进程标识符(如果可用) 。如果没有进程正在运行,则返回0 。
返回的渠道模式QProcess标准输出和标准错误通道。
这个函数中引入了Qt 4.2中。
See also setProcessChannelMode( )ProcessChannelMode和setReadChannel( ) 。
返回环境,QProcess将启动一个进程时,或一个空的对象,如果没有环境一直使用设置使用setEnvironment()或setProcessEnvironment( ) 。如果没有环境已被设置,则调用进程的环境将被使用。
Note:环境设置将被忽略在Windows CE上,因为有一个环境的概念。
此功能被引入Qt的4.6 。
See also setProcessEnvironment( )setEnvironment()和QProcessEnvironment.isEmpty( ) 。
不管当前的读通道,这个函数返回一个可用的所有数据处理的标准误差为QByteArray。
See also readyReadStandardError( )readAllStandardOutput( )readChannel()和setReadChannel( ) 。
不管当前的读通道,这个函数返回一个可用的所有数据处理的标准输出作为QByteArray。
See also readyReadStandardOutput( )readAllStandardError( )readChannel()和setReadChannel( ) 。
返回的当前读取通道QProcess。
See also setReadChannel( ) 。
从重新实现QIODevice.readData( ) 。
此功能已被弃用。
设置环境QProcess启动进程的时候会用environment指定它由key = value对的列表。
例如,下面的代码添加C:\\BIN目录的可执行文件的路径列表(PATHS)在Windows上:
QProcess process; QStringList env = QProcess.systemEnvironment(); env << "TMPDIR=C:\\MyApp\\temp"; // Add an environment variable env.replaceInStrings(QRegExp("^PATH=(.*)", Qt.CaseInsensitive), "PATH=\\1;C:\\Bin"); process.setEnvironment(env); process.start("myapp");
Note:这个函数是比低效率setProcessEnvironment()函数。
See also environment( )setProcessEnvironment()和systemEnvironment( ) 。
设置的通道模式QProcess标准输出和标准错误通道到mode规定。此模式将在下一次使用start()被调用。例如:
QProcess builder; builder.setProcessChannelMode(QProcess.MergedChannels); builder.start("make", QStringList() << "-j2"); if (!builder.waitForFinished()) qDebug() << "Make failed:" << builder.errorString(); else qDebug() << "Make output:" << builder.readAll();
这个函数中引入了Qt 4.2中。
See also processChannelMode( )ProcessChannelMode和setReadChannel( ) 。
设置环境QProcess启动进程的时候会用environment对象。
例如,下面的代码添加C:\\BIN目录的可执行文件的路径列表(PATHS)在Windows和套TMPDIR:
QProcess process; QProcessEnvironment env = QProcessEnvironment.systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable env.insert("PATH", env.value("Path") + ";C:\\Bin"); process.setProcessEnvironment(env); process.start("myapp");
请注意如何在Windows上,环境变量名称是区分大小写的。
此功能被引入Qt的4.6 。
See also processEnvironment( )QProcessEnvironment.systemEnvironment()和setEnvironment( ) 。
设置的当前状态QProcess到state规定。
See also state( ) 。
设置的当前读取通道QProcess为给定的channel。当前输入信道是所使用的函数read( )readAll( )readLine()和getChar( ) 。这也决定了通道的触发QProcess to emit readyRead( ) 。
See also readChannel( ) 。
重定向进程的标准错误到文件fileName。当重定向到位,标准错误读取通道被关闭:使用从它读read( )总是会失败,因为意志readAllStandardError( ) 。该文件将被追加到,如果mode被追加,否则会被截断。
See setStandardOutputFile( )有关如何打开该文件的详细信息。
注:如果setProcessChannelMode( )被调用时的参数QProcess.MergedChannels时,此功能没有任何影响。
这个函数中引入了Qt 4.2中。
See also setStandardInputFile( )setStandardOutputFile()和setStandardOutputProcess( ) 。
重定向进程的标准输入到由指定的文件fileName。当输入重定向到位,QProcess对象将在只读模式(调用write( )将导致错误)。
如果文件fileName此刻不存在start()被调用或者不可读,启动过程将失败。
调用setStandardInputFile ()之后的过程中已经开始没有任何效果。
这个函数中引入了Qt 4.2中。
See also setStandardOutputFile( )setStandardErrorFile()和setStandardOutputProcess( ) 。
重定向进程的标准输出到文件fileName。当重定向到位,标准输出读取通道被关闭:使用从它读read( )总是会失败,因为意志readAllStandardOutput( ) 。
如果文件fileName此刻不存在start( )被调用时,它会被创建。如果它不能被创建,起始将会失败。
如果该文件存在,并且mode is QIODevice.Truncate,该文件将被截断。否则(如果mode is QIODevice.Append) ,该文件将被追加到。
调用setStandardOutputFile ()之后的过程中已经开始没有任何效果。
这个函数中引入了Qt 4.2中。
See also setStandardInputFile( )setStandardErrorFile()和setStandardOutputProcess( ) 。
管这个过程的标准输出流的destination进程的标准输入。
下面的shell命令:
command1 | command2
可以完成与QProcesses用下面的代码:
QProcess process1; QProcess process2; process1.setStandardOutputProcess(&process2); process1.start("command1"); process2.start("command2");
这个函数中引入了Qt 4.2中。
这个函数被调用的子进程的上下文,即,经过之前的程序是在Unix或Mac OS X (执行fork(),但在此之前execve()) 。重新实现这个功能做的子进程的最后一分钟的初始化。例如:
class SandboxProcess : public QProcess { ... protected: void setupChildProcess(); ... }; void SandboxProcess.setupChildProcess() { // Drop all privileges in the child process, and enter // a chroot jail. #if defined Q_OS_UNIX .setgroups(0, 0); .chroot("/etc/safe"); .chdir("/"); .setgid(safeGid); .setuid(safeUid); .umask(0); #endif }
你不能从这个函数退出过程(通过调用exit ( ) ,例如) 。如果你需要在开始执行前停止程序,你的解决方法是发出finished(),然后调用exit ( ) 。
Warning:调用此函数由QProcess在Unix和Mac OS X只。在Windows和QNX ,那就不叫。
设置工作目录dir。QProcess将启动此目录中的过程。默认行为是启动该进程在调用进程的工作目录。
Note:工作目录设置将被忽略在Symbian ,这个过程的私有目录被认为是其工作目录。
Note:QNX的,这可能导致所有应用程序线程暂时冻结。
See also workingDirectory()和start( ) 。
开始定program在一个新的进程,如果没有已经在运行,通过命令行参数中arguments。该OpenMode被设置为mode。
该QProcess对象将立即进入启动状态。如果进程启动成功,QProcess会发出started( ),否则,error()将被发射。如果QProcess对象已在运行的过程中,一个警告可能会打印在控制台,而现有的程序将继续运行。
Note:过程是异步启动,这意味着started()和error( )信号可能会被延迟。通话waitForStarted( ),以确保这一进程已经开始(或无法启动),和这些信号已经发出。
Note:被执行的参数没有进一步分裂。
Windows:包含空格的参数被包装在引号中。
See also pid( )started()和waitForStarted( ) 。
这是一个重载函数。
启动程序program在一个新的进程,如果尚未运行。program是一个同时包含程序名和参数单个文本字符串。该参数由一个或多个空格隔开。例如:
QProcess process; process.start("del /s *.txt"); // same as process.start("del", QStringList() << "/s" << "*.txt"); ...
该program字符串也可以包含引号,以确保含有空格的参数是否正确提供给新的进程。例如:
QProcess process; process.start("dir \"My Documents\"");
如果QProcess对象已在运行的过程中,一个警告可能会打印在控制台,而现有的程序将继续运行。
需要注意的是,在Windows上,报价需要既逃脱了,并引述。例如,上面的代码会以下面的方式被指定,以确保"My Documents"作为参数传递给dir可执行文件:
QProcess process; process.start("dir \"\"\"My Documents\"\"\"");
该OpenMode被设置为mode。
启动程序program与参数arguments在一个新的进程,并从分离它。成功时返回TRUE ,否则返回False 。如果调用进程退出,脱离的进程将继续生活。
需要注意的是包含空格的参数不传递到过程作为单独的参数。
Unix:在启动过程中会在它自己的会话中运行,并作为守护程序运行。
Windows:包含空格的参数被包装在引号中。在启动过程中会作为一个经常性的独立的进程中运行。
这一过程将在目录中开始workingDirectory。
Note:QNX的,这可能导致所有应用程序线程暂时冻结。
Note:VxWorks的,这将启动RTP过程中始终具有优先级设置为220 。
如果函数成功,则*pid被设定为启动的过程的进程标识符。
启动程序program用给定的arguments在一个新的进程,并从分离它。成功时返回TRUE ,否则返回False 。如果调用进程退出,脱离的进程将继续生活。
Note:包含空格的参数没有被传递给进程作为独立参数。
Unix:在启动过程中会在它自己的会话中运行,并作为守护程序运行。
Windows:包含空格的参数被包装在引号中。在启动过程中会作为一个经常性的独立的进程中运行。
这是一个重载函数。
启动程序program在一个新的进程。program是一个同时包含程序名和参数单个文本字符串。该参数由一个或多个空格隔开。
该program字符串也可以包含引号,以确保含有空格的参数是否正确提供给新的进程。
返回该过程的当前状态。
See also stateChanged()和error( ) 。
返回调用进程的环境为key = value对的列表。例如:
QStringList environment = QProcess.systemEnvironment(); // environment = {"PATH=/usr/bin:/usr/local/bin", // "USER=greg", "HOME=/home/greg"}
这个函数不缓存系统环境。因此,有可能获得环境的更新版本,如果低级别的C库函数如setenvOTputenv已被调用。
但是请注意,重复调用此函数将重新创建的环境变量列表,这是一个不平凡的操作。
Note:为新的代码,它是推荐使用QProcessEnvironment.systemEnvironment( )
这个函数是Qt 4.1中引入。
See also QProcessEnvironment.systemEnvironment( )environment()和setEnvironment( ) 。
这种方法也是一个Qt槽与C + +的签名void terminate()。
试图终止进程。
这个过程可能不会退出作为调用这个函数(它被赋予机会提示用户输入任何未保存的文件等)的结果。
在Windows中,终止( )投递一个WM_CLOSE消息过程中的所有顶层窗口,然后在过程本身的主线程。在Unix和Mac OS X SIGTERM信号被发送。
在不运行一个事件循环,或者其事件循环不处理WM_CLOSE消息的Windows控制台应用程序,只能通过调用被终止kill( ) 。
在Symbian ,此功能需要平台的安全能力PowerMgmt。如果不存在,该过程将恐慌与KERN - EXEC 46 。
Note:终止其他进程正在运行的进程通常会导致Symbian的恐慌,由于平台的安全性。
See also Symbian Platform Security Requirements和kill( ) 。
从重新实现QIODevice.waitForBytesWritten( ) 。
块,直到该进程已结束,finished()信号已被发出,或直到msecs毫秒过去了。
返回True如果这个过程完成,否则返回False (如果操作超时,如果出现错误,或者如果这QProcess已经完成) 。
此功能可以操作没有一个事件循环。编写非GUI的应用程序和在非GUI线程执行I / O操作时,它是有用的。
Warning:从主(图形用户界面)线程调用该函数可能会导致你的用户界面冻结。
如果毫秒为-1 ,此功能将不会超时。
See also finished( )waitForStarted( )waitForReadyRead()和waitForBytesWritten( ) 。
从重新实现QIODevice.waitForReadyRead( ) 。
块,直到该进程已经开始,started()信号已被发出,或直到msecs毫秒过去了。
返回True如果该进程已成功启动,否则返回False (如果操作超时,或者如果发生错误) 。
此功能可以操作没有一个事件循环。编写非GUI的应用程序和在非GUI线程执行I / O操作时,它是有用的。
Warning:从主(图形用户界面)线程调用该函数可能会导致你的用户界面冻结。
如果毫秒为-1 ,此功能将不会超时。
See also started( )waitForReadyRead( )waitForBytesWritten()和waitForFinished( ) 。
If QProcess已指派一个工作目录,这个函数返回的工作目录,该QProcess将进入程序启动之前。否则, (即,没有目录已分配, )一个空字符串返回,QProcess将使用应用程序的当前工作目录中。
See also setWorkingDirectory( ) 。
从重新实现QIODevice.writeData( ) 。
这是该信号的默认超载。
当使用过程中发生错误,这个信号被发射。指定error描述发生错误的类型。
这是该信号的默认超载。
当该过程完成时,这个信号被发射。exitCode是该进程的退出代码,exitStatus是的退出状态。之后的过程完成后,该缓冲器中QProcess仍然完好无损。你仍然可以读取该进程可能已写入之前,完成所有数据。
See also exitStatus( ) 。
这是该信号的默认超载。
这个信号被发射时的过程中取得了新的数据可通过其标准错误通道(stderr) 。目前它是不管发射read channel。
See also readAllStandardError()和readChannel( ) 。
这是该信号的默认超载。
这个信号被发射时的过程中取得了新的数据可以通过它的标准输出通道(stdout) 。目前它是不管发射read channel。
See also readAllStandardOutput()和readChannel( ) 。
这是该信号的默认超载。
这个信号是由发射QProcess当这个过程已经开始,state()返回Running。
这是该信号的默认超载。
这个信号被发射时的状态QProcess变化。该newState参数是状态QProcess更改为。
PyQt 4.10.3 for X11 | Copyright © Riverbank Computing Ltd and Nokia 2012 | Qt 4.8.5 |