PySide6.QtCore.QProcess¶
- class QProcess¶
QProcess
类用于启动外部程序并与之通信。More_…概要¶
方法¶
def
__init__()
def
arguments()
def
environment()
def
error()
def
exitCode()
def
exitStatus()
def
processId()
def
program()
def
readChannel()
def
setArguments()
def
setEnvironment()
def
setProgram()
def
setReadChannel()
def
start()
def
startCommand()
def
startDetached()
def
state()
def
waitForStarted()
插槽¶
def
kill()
def
terminate()
信号¶
def
errorOccurred()
def
finished()
def
started()
def
stateChanged()
静态函数¶
def
execute()
def
nullDevice()
def
splitCommand()
def
startDetached()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
运行一个进程¶
要启动一个进程,请将您想要运行的程序名称和命令行参数作为参数传递给
start()
。参数以QStringList
中的单独字符串形式提供。或者,您可以使用
setProgram()
和setArguments()
设置程序运行,然后调用start()
或open()
。例如,以下代码片段通过在参数列表中传递包含“-style”和“fusion”的字符串作为两个项目,在X11平台上以Fusion风格运行模拟时钟示例:
parent = QObject() ... program = "./path/to/Qt/examples/widgets/analogclock" arguments = QStringList() arguments << "-style" << "fusion" myProcess = QProcess(parent) myProcess.start(program, arguments)
QProcess
然后进入Starting
状态,当程序启动后,QProcess
进入Running
状态并发出started()
信号。QProcess
允许你将一个进程视为一个顺序的I/O设备。你可以像使用QTcpSocket访问网络连接一样,向进程写入和从进程读取数据。然后,你可以通过调用write()
来写入进程的标准输入,并通过调用read()
、readLine()
和getChar()
来读取标准输出。由于它继承了QIODevice
,QProcess
也可以用作QXmlReader的输入源,或用于生成要使用QNetworkAccessManager上传的数据。当进程退出时,
QProcess
重新进入NotRunning
状态(初始状态),并发出finished()
。finished()
信号提供了进程的退出代码和退出状态作为参数,你也可以调用exitCode()
来获取最后一个完成进程的退出代码,以及exitStatus()
来获取其退出状态。如果在任何时候发生错误,QProcess
将会发出errorOccurred()
信号。你也可以调用error()
来查找最后发生的错误类型,以及state()
来查找当前进程状态。注意
QProcess
在 VxWorks、iOS、tvOS 或 watchOS 上不受支持。查找可执行文件¶
要运行的程序可以通过调用
setProgram()
或直接在start()
调用中设置。使用程序名称和参数调用start()
的效果等同于在该函数之前调用setProgram()
和setArguments()
,然后调用没有这些参数的重载。QProcess
以三种不同的方式解释程序名称,类似于 Unix shell 和 Windows 命令解释器在它们自己的命令行中的操作方式:如果程序名称是绝对路径,那么将启动该确切的执行文件,并且
QProcess
不会进行任何搜索。如果程序名称是一个包含多个路径组件的相对路径(即至少包含一个斜杠),则搜索该相对路径的起始目录取决于操作系统:在Windows上,它是父进程的当前工作目录,而在Unix上,它是通过
setWorkingDirectory()
设置的目录。如果程序名称是一个没有斜杠的普通文件名,其行为取决于操作系统。在Unix系统上,
QProcess
将搜索PATH
环境变量;在Windows上,搜索由操作系统执行,并且会在PATH
环境变量之前首先搜索父进程的当前目录(有关完整列表,请参阅CreateProcess的文档)。
为了避免平台依赖行为或当前应用程序启动方式引起的任何问题,建议始终传递要启动的可执行文件的绝对路径。对于与应用程序一起提供的辅助二进制文件,可以从
applicationDirPath()
开始构建这样的路径。同样,要显式运行相对于setWorkingDirectory()
设置的目录找到的可执行文件,请根据情况使用以“./”或“../”开头的程序路径。在Windows上,除了CreateProcess文档中概述的情况外,大多数情况下不需要“.exe”后缀。此外,
QProcess
会将Unix风格的正斜杠转换为Windows路径的反斜杠,以便用于程序名称。这使得使用QProcess
的代码可以以跨平台的方式编写,如上例所示。QProcess
不支持直接执行 Unix shell 或 Windows 命令解释器的内置函数,例如cmd.exe
的dir
命令或 Bourne shell 的export
。在 Unix 上,尽管许多 shell 内置函数也作为独立的可执行文件提供,但它们的行为可能与作为内置函数实现的行为不同。要运行这些命令,应显式地执行解释器并带上适当的选项。对于 Unix 系统,启动 “/bin/sh” 并带上两个参数:“-c” 和要运行的命令行字符串。对于 Windows,由于cmd.exe
解析其命令行的非标准方式,请使用setNativeArguments()
(例如,“/c dir d:”)。环境变量¶
QProcess
API 提供了操作子进程将看到的环境变量的方法。默认情况下,子进程将拥有调用start()
函数时存在的当前进程环境变量的副本。这意味着在该调用之前使用qputenv()
执行的任何修改都会反映在子进程的环境中。请注意,QProcess
不会尝试防止与其他线程中发生的qputenv()
竞争条件,因此建议在应用程序初始启动后避免使用qputenv()
。可以使用
processEnvironment()
和setProcessEnvironment()
函数来修改特定子进程的环境,这些函数使用QProcessEnvironment
类。默认情况下,processEnvironment()
将返回一个inheritsFromParent()
为true的对象。设置一个不从父进程继承的环境将导致QProcess
在启动子进程时使用该环境。正常场景从当前环境开始,通过调用
systemEnvironment()
,然后继续添加、更改或删除特定变量。然后可以将生成的变量列表应用于QProcess
,使用setProcessEnvironment()
。可以使用QProcessEnvironment()默认构造函数从环境中删除所有变量或从空环境开始。在受控和系统特定条件之外不建议这样做,因为当前进程环境中可能设置了系统变量,这些变量是子进程正确执行所必需的。
在Windows上,如果未设置当前进程的
"PATH"
和"SystemRoot"
环境变量,QProcess
将复制它们。无法完全取消设置它们,但可以将它们设置为空值。在Windows上将"PATH"
设置为空值可能会导致子进程无法启动。通过通道进行通信¶
进程有两个预定义的输出通道:标准输出通道(
stdout
)提供常规的控制台输出,标准错误通道(stderr
)通常提供进程打印的错误信息。这些通道代表两个独立的数据流。您可以通过调用setReadChannel()
在它们之间切换。QProcess
在当前读取通道上有数据可用时发出readyRead()
信号。当有新的标准输出数据可用时,它还会发出readyReadStandardOutput()
信号,当有新的标准错误数据可用时,发出readyReadStandardError()
信号。您可以通过调用readAllStandardOutput()
或readAllStandardError()
显式地从任一通道读取所有数据,而不是调用read()
、readLine()
或getChar()
。通道的术语可能会引起误解。请注意,进程的输出通道对应于
QProcess
的读取通道,而进程的输入通道对应于QProcess
的写入通道。这是因为我们使用QProcess
读取的是进程的输出,而我们写入的内容则成为进程的输入。QProcess
可以合并两个输出通道,使得运行进程的标准输出和标准错误数据都使用标准输出通道。在启动进程之前,调用setProcessChannelMode()
并传递MergedChannels
来激活此功能。您还可以通过传递ForwardedChannels
作为参数,将运行进程的输出转发到调用的主进程。也可以只转发其中一个输出通道 - 通常使用ForwardedErrorChannel
,但ForwardedOutputChannel
也存在。请注意,在 GUI 应用程序中使用通道转发通常不是一个好主意 - 您应该以图形方式呈现错误。某些进程需要特殊的环境设置才能运行。您可以通过调用
setProcessEnvironment()
来为您的进程设置环境变量。要设置工作目录,请调用setWorkingDirectory()
。默认情况下,进程在调用进程的当前工作目录中运行。属于使用
QProcess
启动的GUI应用程序的窗口的定位和屏幕Z顺序由底层窗口系统控制。对于Qt 5应用程序,可以使用-qwindowgeometry
命令行选项指定定位;X11应用程序通常接受-geometry
命令行选项。同步处理API¶
QProcess
提供了一组函数,允许它在没有事件循环的情况下使用,通过挂起调用线程直到某些信号被发出:waitForStarted()
阻塞直到进程启动。waitForReadyRead()
阻塞直到当前读取通道上有新数据可供读取。waitForBytesWritten()
阻塞直到一个数据负载被写入进程。waitForFinished()
阻塞直到进程完成。
从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致您的用户界面冻结。
以下示例运行
gzip
来压缩字符串“Qt rocks!”,没有事件循环:gzip = QProcess() gzip.start("gzip", QStringList() << "-c") if not gzip.waitForStarted(): return False gzip.write("Qt rocks!") gzip.closeWriteChannel() if not gzip.waitForFinished(): return False result = gzip.readAll()
另请参阅
- class ProcessError¶
此枚举描述了由
QProcess
报告的不同类型的错误。常量
描述
QProcess.FailedToStart
进程启动失败。可能是调用的程序缺失,或者您可能没有足够的权限或资源来调用该程序。
QProcess.Crashed
进程在成功启动后的一段时间内崩溃了。
QProcess.Timedout
最后一个waitFor…()函数超时。
QProcess
的状态未改变,您可以尝试再次调用waitFor…()。QProcess.WriteError
尝试写入进程时发生错误。例如,进程可能未运行,或者可能已关闭其输入通道。
QProcess.ReadError
尝试从进程读取时发生错误。例如,进程可能没有运行。
QProcess.UnknownError
发生了一个未知错误。这是
error()
的默认返回值。另请参阅
- class ProcessState¶
此枚举描述了
QProcess
的不同状态。常量
描述
QProcess.NotRunning
进程未运行。
QProcess.Starting
进程正在启动,但程序尚未被调用。
QProcess.Running
进程正在运行,并且可以进行读取和写入。
另请参阅
- class ProcessChannel¶
此枚举描述了运行进程使用的进程通道。将其中一个值传递给
setReadChannel()
以设置QProcess
的当前读取通道。常量
描述
QProcess.StandardOutput
运行进程的标准输出(stdout)。
QProcess.StandardError
运行进程的标准错误(stderr)。
另请参阅
- class ProcessChannelMode¶
此枚举描述了
QProcess
的进程输出通道模式。将其中一个值传递给setProcessChannelMode()
以设置当前的读取通道模式。常量
描述
QProcess.SeparateChannels
QProcess
管理运行进程的输出,将标准输出和标准错误数据保存在单独的内部缓冲区中。您可以通过调用setReadChannel()
来选择QProcess
的当前读取通道。这是QProcess
的默认通道模式。QProcess.MergedChannels
QProcess
将运行进程的输出合并到标准输出通道 (stdout
)。标准错误通道 (stderr
) 将不会接收任何数据。运行进程的标准输出和标准错误数据是交错的。对于分离的进程,运行进程的合并输出将转发到主进程。QProcess.ForwardedChannels
QProcess
将运行进程的输出转发到主进程。子进程写入其标准输出和标准错误的任何内容都将写入主进程的标准输出和标准错误。QProcess.ForwardedErrorChannel
QProcess
管理运行进程的标准输出,但将其标准错误转发到主进程。这反映了命令行工具作为过滤器的典型用法,其中标准输出被重定向到另一个进程或文件,而标准错误则打印到控制台以用于诊断目的。(此值在 Qt 5.2 中引入。)QProcess.ForwardedOutputChannel
与ForwardedErrorChannel互补。(此值在Qt 5.2中引入。)
注意
Windows 有意抑制仅限 GUI 的应用程序向继承的控制台输出。这不适用于重定向到文件或管道的输出。尽管如此,要在控制台上转发仅限 GUI 的应用程序的输出,您必须使用 SeparateChannels 并通过读取输出并将其写入适当的输出通道来自行进行转发。
- class InputChannelMode¶
此枚举描述了
QProcess
的进程输入通道模式。将其中一个值传递给setInputChannelMode()
以设置当前的写入通道模式。常量
描述
QProcess.ManagedInputChannel
QProcess.ForwardedInputChannel
QProcess
将主进程的输入转发到正在运行的进程。子进程从与主进程相同的源读取其标准输入。请注意,在子进程运行时,主进程不得尝试读取其标准输入。
- class ExitStatus¶
此枚举描述了
QProcess
的不同退出状态。常量
描述
QProcess.NormalExit
进程正常退出。
QProcess.CrashExit
进程崩溃了。
另请参阅
- class UnixProcessFlag¶
(继承自
enum.Flag
) 这些标志可以用于UnixProcessParameters
的flags
字段。常量
描述
QProcess.UnixProcessFlag.CloseFileDescriptors
关闭所有高于
lowestFileDescriptorToClose
定义阈值的文件描述符,防止父进程中当前打开的描述符意外泄漏到子进程。stdin
、stdout
和stderr
文件描述符永远不会被关闭。QProcess.UnixProcessFlag.CreateNewSession
通过调用
setsid(2)
启动一个新的进程会话。这允许子进程在当前进程所在的会话结束后继续存在。这是startDetached()
采取的一个步骤,以允许进程分离,也是将一个进程守护化的步骤之一。QProcess.UnixProcessFlag.DisconnectControllingTerminal
请求进程从其控制终端断开连接,如果它有的话。如果没有,则不会发生任何事情。如果终端关闭,仍然连接到控制终端的进程可能会收到挂断信号(
SIGHUP
),或者其他终端控制信号(SIGTSTP
、SIGTTIN
、SIGTTOU
)。请注意,在某些操作系统上,进程只有在它是会话领导者时才能从控制终端断开连接,这意味着可能需要CreateNewSession
标志。像它一样,这是将进程守护化的步骤之一。QProcess.UnixProcessFlag.IgnoreSigPipe
始终将
SIGPIPE
信号设置为忽略(SIG_IGN
),即使设置了ResetSignalHandlers
标志。默认情况下,如果子进程在相应的通道通过closeReadChannel()
关闭后尝试写入其标准输出或标准错误,它将收到SIGPIPE
信号并立即终止;使用此标志,写入操作将失败而不会发出信号,子进程可以继续执行。QProcess.UnixProcessFlag.ResetIds
放弃当前进程可能仍然保留的任何有效的用户或组ID(参见
setuid(2)
和setgid(2)
,以及QCoreApplication::setSetuidAllowed())。如果当前进程是setuid或setgid,并且不希望子进程保留提升的权限,这将非常有用。QProcess.UnixProcessFlag.ResetSignalHandlers
将所有Unix信号处理程序重置为其默认状态(即传递
SIG_DFL
给signal(2)
)。此标志有助于确保任何被忽略的(SIG_IGN
)信号不会影响子进程的行为。QProcess.UnixProcessFlag.UseVFork
请求
QProcess
使用vfork(2)
来启动子进程。使用此标志表示通过setChildProcessModifier()
设置的回调函数在vfork(2)
的子进程中执行是安全的;也就是说,回调函数不会修改任何非局部变量(直接或通过它调用的任何函数),也不会尝试与父进程通信。QProcess
是否实际使用vfork(2)
以及vfork(2)
是否与标准的fork(2)
不同是由实现定义的。在版本6.6中添加。
使用给定的
parent
构造一个QProcess
对象。- arguments()¶
- Return type:
字符串列表
返回进程最后一次启动时使用的命令行参数。
另请参阅
- closeReadChannel(channel)¶
- Parameters:
channel –
ProcessChannel
关闭读取通道
channel
。调用此函数后,QProcess
将不再接收该通道上的数据。任何已经接收到的数据仍然可以读取。调用此函数以节省内存,如果您对进程的输出不感兴趣。
- closeWriteChannel()¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
安排关闭
QProcess
的写入通道。一旦所有数据都已写入进程,通道将关闭。调用此函数后,任何尝试写入进程的操作都将失败。关闭写入通道对于读取输入数据直到通道关闭的程序是必要的。例如,程序“more”用于在Unix和Windows的控制台中显示文本数据。但在
QProcess
的写入通道关闭之前,它不会显示文本数据。示例:more = QProcess() more.start("more") more.write("Text to display") more.closeWriteChannel() # QProcess will emit readyRead() once "more" starts printing
当调用
start()
时,写通道会隐式打开。另请参阅
- environment()¶
- Return type:
字符串列表
返回
QProcess
将传递给其子进程的环境,如果未使用setEnvironment()
设置环境,则返回空的QStringList
。如果未设置环境,则将使用调用进程的环境。- error()¶
- Return type:
返回上次发生的错误类型。
另请参阅
- errorOccurred(error)¶
- Parameters:
错误 –
ProcessError
当进程发生错误时,会发出此信号。指定的
error
描述了发生的错误类型。- static execute(program[, arguments={}])¶
- Parameters:
program – str
arguments – 字符串列表
- Return type:
整数
启动程序
program
并使用参数arguments
在新进程中运行,等待其完成,然后返回进程的退出代码。新进程写入控制台的任何数据都会转发给调用进程。环境和工作目录是从调用进程继承的。
参数处理与相应的
start()
重载相同。如果进程无法启动,则返回-2。如果进程崩溃,则返回-1。否则,返回进程的退出代码。
另请参阅
- exitCode()¶
- Return type:
整数
返回最后一个完成进程的退出代码。
除非
exitStatus()
返回NormalExit
,否则此值无效。- exitStatus()¶
- Return type:
返回最后一个完成进程的退出状态。
在Windows上,如果进程被另一个应用程序使用TerminateProcess()终止,此函数仍将返回
NormalExit
,除非退出代码小于0。- failChildProcessModifier(description[, error=0])¶
- Parameters:
描述 – str
error – int
此函数可以在修饰符集中使用
setChildProcessModifier()
来指示遇到错误情况。当修饰符调用这些函数时,QProcess
将在父进程中发出errorOccurred()
,并带有代码FailedToStart
。description
可用于在errorString()
中包含一些信息以帮助诊断问题,通常是失败的调用名称,类似于C库函数perror()
。此外,error
参数可以是
错误代码,其文本形式也将被包含。例如,子修饰符可以这样为子进程准备一个额外的文件描述符:
process.setChildProcessModifier([fd, &process]() { if (dup2(fd, TargetFileDescriptor) < 0) process.failChildProcessModifier(errno, "aux comm channel"); }); process.start();
其中
fd
是父进程中当前打开的文件描述符。如果dup2()
系统调用导致EBADF
条件,进程errorString()
可能是“子进程修饰符报告错误:辅助通信通道:错误的文件描述符”。此函数不会返回到调用者。除了在子修饰符中使用以及使用正确的
QProcess
对象外,在其他任何地方使用它都是未定义的行为。注意
实现中对
description
参数施加了长度限制,大约为500个字符。这不包括来自error
代码的文本。另请参阅
setChildProcessModifier()
setUnixProcessParameters()
- finished(exitCode[, exitStatus=QProcess.ExitStatus.NormalExit])¶
- Parameters:
exitCode – int
exitStatus –
ExitStatus
当进程结束时,会发出此信号。
exitCode
是进程的退出代码(仅对正常退出有效),而exitStatus
是退出状态。进程结束后,QProcess
中的缓冲区仍然完好无损。您仍然可以读取进程在结束前可能写入的任何数据。另请参阅
- inputChannelMode()¶
- Return type:
返回
QProcess
标准输入通道的通道模式。- kill()¶
终止当前进程,导致其立即退出。
在Windows上,kill()使用TerminateProcess,而在Unix和macOS上,SIGKILL信号被发送到进程。
另请参阅
- static nullDevice()¶
- Return type:
字符串
操作系统的空设备。
返回的文件路径使用本机目录分隔符。
- processChannelMode()¶
- Return type:
返回
QProcess
标准输出和标准错误通道的通道模式。- processEnvironment()¶
- Return type:
返回
QProcess
将传递给其子进程的环境。如果未使用setProcessEnvironment()
设置环境,则此方法返回一个对象,表示环境将从父进程继承。另请参阅
- processId()¶
- Return type:
整数
返回当前运行进程的本机进程标识符(如果可用)。如果没有进程正在运行,则返回
0
。- program()¶
- Return type:
字符串
返回进程最后启动时使用的程序。
另请参阅
- readAllStandardError()¶
- Return type:
无论当前读取通道如何,此函数都会从进程的标准错误中返回所有可用数据,作为
QByteArray
。- readAllStandardOutput()¶
- Return type:
无论当前读取通道如何,此函数都会从进程的标准输出中返回所有可用数据,作为
QByteArray
。- readChannel()¶
- Return type:
返回
QProcess
的当前读取通道。另请参阅
- readyReadStandardError()¶
当进程通过其标准错误通道(
stderr
)提供新数据时,会发出此信号。无论当前的read channel
如何,都会发出此信号。- readyReadStandardOutput()¶
当进程通过其标准输出通道(
stdout
)提供新数据时,会发出此信号。无论当前的read channel
是什么,都会发出此信号。- setArguments(arguments)¶
- Parameters:
arguments – 字符串列表
设置启动进程时传递给被调用程序的
arguments
。此函数必须在start()
之前调用。- setEnvironment(environment)¶
- Parameters:
环境 – 字符串列表
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
设置
QProcess
将传递给子进程的环境。参数environment
是一个键值对的列表。例如,以下代码添加了环境变量
TMPDIR
:process = QProcess() env = QProcess.systemEnvironment() env << "TMPDIR=C:\\MyApp\\temp" # Add an environment variable process.setEnvironment(env) process.start("myapp")
注意
此函数的效率低于
setProcessEnvironment()
函数。- setInputChannelMode(mode)¶
- Parameters:
mode –
InputChannelMode
将
QProcess
标准输入通道的通道模式设置为指定的mode
。此模式将在下次调用start()
时使用。- setProcessChannelMode(mode)¶
- Parameters:
mode –
ProcessChannelMode
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
将
QProcess
标准输出和标准错误通道的通道模式设置为指定的mode
。此模式将在下次调用start()
时使用。例如:builder = QProcess() builder.setProcessChannelMode(QProcess.MergedChannels) builder.start("make", QStringList() << "-j2") if not builder.waitForFinished(): print("Make failed:", builder.errorString()) else: print("Make output:", builder.readAll())
- setProcessEnvironment(environment)¶
- Parameters:
环境 –
QProcessEnvironment
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
设置
QProcess
将传递给子进程的environment
。例如,以下代码添加了环境变量
TMPDIR
:process = QProcess() env = QProcessEnvironment.systemEnvironment() env.insert("TMPDIR", "C:\\MyApp\\temp") # Add an environment variable process.setProcessEnvironment(env) process.start("myapp")
请注意,在Windows上,环境变量名称是不区分大小写的。
另请参阅
- setProcessState(state)¶
- Parameters:
状态 –
ProcessState
将
QProcess
的当前状态设置为指定的state
。另请参阅
- setProgram(program)¶
- Parameters:
program – 字符串
设置启动进程时要使用的
program
。此函数必须在start()
之前调用。如果
program
是一个绝对路径,它指定了将要启动的确切可执行文件。相对路径将以平台特定的方式解析,包括搜索PATH
环境变量(详见Finding the Executable
)。- setReadChannel(channel)¶
- Parameters:
channel –
ProcessChannel
将
QProcess
的当前读取通道设置为给定的channel
。当前输入通道由函数read()
、readAll()
、readLine()
和getChar()
使用。它还决定了哪个通道会触发QProcess
发出readyRead()
。另请参阅
- setStandardErrorFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])¶
- Parameters:
fileName – str
mode –
OpenModeFlag
的组合
将进程的标准错误重定向到文件
fileName
。当重定向生效时,标准错误读取通道将关闭:使用read()
读取它将始终失败,readAllStandardError()
也是如此。如果mode
为Append,文件将被追加,否则将被截断。有关文件如何打开的更多信息,请参见
setStandardOutputFile()
。注意:如果使用参数
MergedChannels
调用了setProcessChannelMode()
,则此函数无效。- setStandardInputFile(fileName)¶
- Parameters:
fileName – str
将进程的标准输入重定向到由
fileName
指示的文件。当输入重定向生效时,QProcess
对象将处于只读模式(调用write()
将导致错误)。为了使进程立即读取EOF,请在此处传递
nullDevice()
。这比在写入任何数据之前使用closeWriteChannel()
更干净,因为它可以在启动进程之前设置。如果文件
fileName
在调用start()
时不存在或不可读,启动过程将失败。在进程启动后调用 setStandardInputFile() 没有效果。
- setStandardOutputFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])¶
- Parameters:
fileName – str
mode –
OpenModeFlag
的组合
将进程的标准输出重定向到文件
fileName
。当重定向生效时,标准输出读取通道将关闭:使用read()
读取它将始终失败,readAllStandardOutput()
也是如此。要丢弃进程的所有标准输出,请在此处传递
nullDevice()
。这比从不读取标准输出更高效,因为不会填充任何QProcess
缓冲区。如果文件
fileName
在调用start()
时不存在,它将被创建。如果无法创建,启动将失败。如果文件存在且
mode
为QIODevice::Truncate,文件将被截断。否则(如果mode
为QIODevice::Append),文件将被追加。在进程启动后调用 setStandardOutputFile() 没有效果。
如果
fileName
是一个空字符串,它将停止重定向标准输出。这在重定向后恢复标准输出时非常有用。警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
将此进程的标准输出流传输到
destination
进程的标准输入。以下 shell 命令:
command1 | command2
可以使用
QProcess
通过以下代码完成:process1 = QProcess() process2 = QProcess() process1.setStandardOutputProcess(process2) process1.start("command1") process2.start("command2")
- setUnixProcessParameters(flagsOnly)¶
- Parameters:
flagsOnly –
UnixProcessFlag
的组合
这是一个重载函数。
在Unix系统上为子进程设置额外的设置为
flagsOnly
。这与仅设置flags
字段的重载相同。- setUnixProcessParameters(params)
- Parameters:
params –
UnixProcessParameters
设置Unix系统上子进程的额外设置和参数为
params
。此函数可用于要求QProcess
在启动目标可执行文件之前修改子进程。此函数可用于更改子进程的某些属性,例如关闭所有多余的文件描述符、更改子进程的优先级或与控制终端断开连接。如需对子进程进行更细粒度的控制或以其他方式修改它,请使用
setChildProcessModifier()
函数。如果同时设置了子进程修改器和Unix进程参数,则修改器将在应用这些参数之前运行。- setWorkingDirectory(dir)¶
- Parameters:
dir – str
将工作目录设置为
dir
。QProcess
将在此目录中启动进程。默认行为是在调用进程的工作目录中启动进程。- static splitCommand(command)¶
- Parameters:
command – str
- Return type:
字符串列表
将字符串
command
分割成一系列标记,并返回该列表。带有空格的标记可以用双引号括起来;三个连续的双引号表示引号字符本身。
- start([mode=QIODeviceBase.OpenModeFlag.ReadWrite])¶
- Parameters:
mode –
OpenModeFlag
的组合
这是一个重载函数。
启动由
setProgram()
设置的程序,并使用由setArguments()
设置的参数。OpenMode设置为mode
。另请参阅
open()
setProgram()
setArguments()
- start(program[, arguments={}[, mode=QIODeviceBase.OpenModeFlag.ReadWrite]])
- Parameters:
program – str
arguments – 字符串列表
mode –
OpenModeFlag
的组合
在新的进程中启动给定的
program
,并将命令行参数传递到arguments
中。有关QProcess
如何搜索要运行的可执行文件的信息,请参见setProgram()
。OpenMode设置为mode
。不会对参数进行进一步的分割。QProcess
对象将立即进入 Starting 状态。如果进程成功启动,QProcess
将发出started()
;否则,将发出errorOccurred()
。请注意,在能够同步启动子进程的平台上(特别是 Windows),这些信号将在该函数返回之前发出,并且此QProcess
对象将分别转换为Running
或NotRunning
状态。在其他平台上,started()
和errorOccurred()
信号将会延迟。调用
waitForStarted()
以确保进程已启动(或启动失败)并且这些信号已发出。即使进程的启动状态已经已知,调用该函数也是安全的,尽管信号不会再次发出。Windows: 参数被引用并连接成一个与
CommandLineToArgvW()
Windows函数兼容的命令行。对于具有不同命令行引用要求的程序,您需要使用setNativeArguments()
。一个不遵循CommandLineToArgvW()
规则的著名程序是cmd.exe,因此,所有批处理脚本也是如此。如果
QProcess
对象已经在运行一个进程,控制台可能会打印一条警告,并且现有的进程将继续运行而不受影响。注意
成功启动子进程仅意味着操作系统已成功创建进程并分配了每个进程都有的资源,例如其进程ID。子进程可能会崩溃或以其他方式非常早地失败,因此不会产生预期的输出。在大多数操作系统中,这可能包括动态链接错误。
另请参阅
processId()
started()
waitForStarted()
setNativeArguments()
- startCommand(command[, mode=QIODeviceBase.OpenModeFlag.ReadWrite])¶
- Parameters:
command – str
mode –
OpenModeFlag
的组合
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
在新进程中启动命令
command
。OpenMode 设置为mode
。command
是一个包含程序名称及其参数的单个文本字符串。参数由一个或多个空格分隔。例如:process = QProcess() process.startCommand("del /s *.txt") # same as process.start("del", QStringList() << "/s" << "*.txt") ...
包含空格的参数必须用引号括起来,以便正确地传递给新进程。例如:
process = QProcess() process.startCommand("dir \"My Documents\"")
在
command
字符串中的字面引号由三重引号表示。例如:process = QProcess() process.startCommand("dir \"Epic 12\"\"\" Singles\"")
在
command
字符串被分割和取消引用后,此函数的行为类似于start()
。在那些将命令行参数传递给子进程的系统API原生使用单个字符串的操作系统(如Windows)上,可以设想一些命令行无法通过
QProcess
的可移植的基于列表的API传递。在这些罕见的情况下,您需要使用setProgram()
和setNativeArguments()
而不是此函数。另请参阅
- startDetached([pid=None])¶
- Parameters:
pid –
qint64
- Return type:
布尔
启动由
setProgram()
设置的程序,并使用由setArguments()
设置的参数在新进程中运行,并与之分离。成功时返回true
;否则返回false
。如果调用进程退出,分离的进程将继续运行而不受影响。Unix: 启动的进程将在其自己的会话中运行,并表现得像一个守护进程。
该过程将在由
setWorkingDirectory()
设置的目录中启动。如果workingDirectory()
为空,则工作目录将从调用过程中继承。如果函数成功,则*``pid``被设置为启动进程的进程标识符;否则,它被设置为-1。请注意,子进程可能会退出,并且PID可能会在没有任何通知的情况下变为无效。此外,在子进程退出后,相同的PID可能会被回收并被完全不同的进程使用。用户代码在使用此变量时应特别小心,特别是如果打算通过操作系统手段强制终止进程。
startDetached() 仅支持以下属性设置器:
setCreateProcessArgumentsModifier()
setNativeArguments()
QProcess
对象的所有其他属性都被忽略。注意
被调用的进程继承调用进程的控制台窗口。要抑制控制台输出,请将标准/错误输出重定向到
nullDevice()
。另请参阅
start()
startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)
- static startDetached(program[, arguments={}[, workingDirectory=""]])
- Parameters:
program – str
arguments – 字符串列表
workingDirectory – str
- Return type:
(retval, pid)
此函数重载了
startDetached()
。在新进程中启动程序
program
并使用参数arguments
,并与之分离。成功时返回true
;否则返回false
。如果调用进程退出,分离的进程将继续运行而不受影响。参数处理与相应的
start()
重载相同。该过程将在目录
workingDirectory
中启动。如果workingDirectory
为空,则工作目录将从调用过程中继承。如果函数成功,则 *``pid`` 被设置为启动进程的进程标识符。
另请参阅
- started()¶
当进程启动时,
QProcess
会发出此信号,并且state()
返回Running
。- state()¶
- Return type:
返回进程的当前状态。
另请参阅
- stateChanged(state)¶
- Parameters:
状态 –
ProcessState
每当
QProcess
的状态发生变化时,都会发出此信号。newState
参数是QProcess
改变后的状态。- static systemEnvironment()¶
- Return type:
字符串列表
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
返回调用进程的环境作为键值对的列表。示例:
environment = QProcess.systemEnvironment() # environment = {"PATH=/usr/bin:/usr/local/bin", # "USER=greg", "HOME=/home/greg"}
此函数不会缓存系统环境。因此,如果调用了像
setenv
或putenv
这样的低级C库函数,可能会获取到更新后的环境版本。然而,请注意,重复调用此函数将重新创建环境变量列表,这是一个非平凡的操作。
- terminate()¶
尝试终止进程。
调用此函数可能不会导致进程退出(它有机会提示用户保存未保存的文件等)。
在Windows上,terminate()会向进程的所有顶层窗口发送WM_CLOSE消息,然后向进程本身的主线程发送消息。在Unix和macOS上,会发送
SIGTERM
信号。在Windows上不运行事件循环或其事件循环不处理WM_CLOSE消息的控制台应用程序,只能通过调用
kill()
来终止。另请参阅
- unixProcessParameters()¶
- Return type:
返回描述将在Unix系统上应用于子进程的额外标志和设置的
UnixProcessParameters
对象。默认设置对应于默认构造的UnixProcessParameters
。- waitForFinished([msecs=30000])¶
- Parameters:
msecs – 整数
- Return type:
布尔
阻塞直到进程完成并且
finished()
信号已发出,或者直到msecs
毫秒过去。如果进程完成,则返回
true
;否则返回false
(如果操作超时、发生错误,或者此QProcess
已经完成)。此函数可以在没有事件循环的情况下运行。它在编写非GUI应用程序和在非GUI线程中执行I/O操作时非常有用。
警告
从主(GUI)线程调用此函数可能会导致您的用户界面冻结。
如果 msecs 为 -1,此函数将不会超时。
另请参阅
finished()
waitForStarted()
waitForReadyRead()
waitForBytesWritten()
- waitForStarted([msecs=30000])¶
- Parameters:
msecs – 整数
- Return type:
布尔
阻塞直到进程已启动并且
started()
信号已发出,或者直到msecs
毫秒已过去。如果进程成功启动,则返回
true
;否则返回false
(如果操作超时或发生错误)。如果进程在此函数之前已经成功启动,则立即返回。此函数可以在没有事件循环的情况下运行。它在编写非GUI应用程序和在非GUI线程中执行I/O操作时非常有用。
警告
从主(GUI)线程调用此函数可能会导致您的用户界面冻结。
如果 msecs 为 -1,此函数将不会超时。
另请参阅
started()
waitForReadyRead()
waitForBytesWritten()
waitForFinished()
- workingDirectory()¶
- Return type:
字符串
如果
QProcess
已被分配了一个工作目录,此函数将返回QProcess
在程序启动前将进入的工作目录。否则(即未分配目录),将返回一个空字符串,QProcess
将使用应用程序的当前工作目录。- class UnixProcessParameters¶
在版本6.6中添加。
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
- PySide6.QtCore.QProcess.UnixProcessParameters.flags¶
- PySide6.QtCore.QProcess.UnixProcessParameters.lowestFileDescriptorToClose¶
- PySide6.QtCore.QProcess.UnixProcessParameters._reserved¶