Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
使用Python2.7通过子流程模块实现os.system(cmd&;)行为_Python_Python 2.7_Subprocess_Os.system - Fatal编程技术网

使用Python2.7通过子流程模块实现os.system(cmd&;)行为

使用Python2.7通过子流程模块实现os.system(cmd&;)行为,python,python-2.7,subprocess,os.system,Python,Python 2.7,Subprocess,Os.system,可能是一个复制品 但是在许多解决方案中,只有os.system(commandtoruninebackground&)看起来很简单,而且可以做到这一点。 不过,据介绍,更推荐使用模块。 因此,如何使用模块以shell的形式运行后台进程(请注意,&)在现代操作系统中,进程自然并行运行,让一个进程等待另一个进程的终止是一种特殊情况。当&语法在60年代后期设计时,情况就不同了。然后你必须标记并行执行 在shell上,这种情况一直持续到今天,这也是因为在许多情况下,让shell在允许用户下一次输入之前等

可能是一个复制品

但是在许多解决方案中,只有
os.system(commandtoruninebackground&)
看起来很简单,而且可以做到这一点。 不过,据介绍,更推荐使用模块。
因此,如何使用模块以shell的形式运行后台进程(请注意,&)在现代操作系统中,进程自然并行运行,让一个进程等待另一个进程的终止是一种特殊情况。当
&
语法在60年代后期设计时,情况就不同了。然后你必须标记并行执行

在shell上,这种情况一直持续到今天,这也是因为在许多情况下,让shell在允许用户下一次输入之前等待命令终止是很方便的,因此仍然存在不等待终止的情况

在编程级别上,
(并行执行)是正常情况,无需采取任何措施即可实现

没有
&
(等待终止)的情况可以通过显式使用
wait()
系统调用来实现(这是shell在大多数情况下所做的)


对于您,只需使用
Popen
,不要调用
wait()
;-)

在现代操作系统中,进程自然并行运行,而让一个进程等待另一个进程的终止是一种特殊情况。当
&
语法在60年代后期设计时,情况就不同了。然后你必须标记并行执行

在shell上,这种情况一直持续到今天,这也是因为在许多情况下,让shell在允许用户下一次输入之前等待命令终止是很方便的,因此仍然存在不等待终止的情况

在编程级别上,
(并行执行)是正常情况,无需采取任何措施即可实现

没有
&
(等待终止)的情况可以通过显式使用
wait()
系统调用来实现(这是shell在大多数情况下所做的)


对于您,只需使用
Popen
,不要调用
wait()
;-)

既然
subprocess.Popen
是非阻塞的,那么为什么要对使用它进行的系统调用进行后台处理呢?正如Zev所说的——与
subprocess.Popen()的默认行为相反,您为什么认为需要这样做
-在后台运行的调用命令?
子进程。Popen
与shell的
&
运算符没有等效项,因为在子进程中没有调用
setpgid(0,0)
的选项来创建后台的新组。否则,如果进程通过stdin从终端读取数据,终端将不会通过
SIGTTIN
停止它,因为它仍然在前台进程组中。使用
os.system
的原因是可以指定带有
&
的原始语法。这里有一个间接的替代方法。将
preexec\u fn
参数设置为调用
setpgid(0,0)
的函数。然后,您可以通过
pid,status=os.waitpid(proc.pid,os.WUNTRACED)检查它是否被终端停止
如果os.WIFSTOPPED(状态):sig=os.WSTOPSIG(状态)
。如果为防止从终端读取而停止,则为
signal.sigtin
;如果为防止写入而停止,则为
signal.sigtou
。通常,终端被配置为允许后台进程对其进行写入。既然
subprocess.Popen
是非阻塞的,那么为什么要对使用它进行的系统调用进行后台处理呢?正如Zev所说——与
subprocess.Popen()的默认行为相反,您认为为什么需要这样做
-在后台运行的调用命令?
子进程。Popen
与shell的
&
运算符没有等效项,因为在子进程中没有调用
setpgid(0,0)
的选项来创建后台的新组。否则,如果进程通过stdin从终端读取数据,终端将不会通过
SIGTTIN
停止它,因为它仍然在前台进程组中。使用
os.system
的原因是可以指定带有
&
的原始语法。这里有一个间接的替代方法。将
preexec\u fn
参数设置为调用
setpgid(0,0)
的函数。然后,您可以通过
pid,status=os.waitpid(proc.pid,os.WUNTRACED)检查它是否被终端停止
如果os.WIFSTOPPED(状态):sig=os.WSTOPSIG(状态)
。如果为防止从终端读取而停止,则为
signal.sigtin
;如果为防止写入而停止,则为
signal.sigtou
。通常,终端配置为允许后台进程写入。值得一提的是,subprocess.Popen默认情况下不运行shell。它接受一个列表:
[程序,arg1,arg2]
(要查看示例,请调用
shlex.split(cmd)
)右键。当OP考虑使用
&
时,他们可能还希望对其他东西使用shell解释步骤。我同意您的观点,即只使用
Popen
,但不同意这样一个事实,即顺序执行只是60年代不推荐使用的功能。Shell在默认情况下使用顺序执行,允许同时输入多个命令(例如从一个文件),同时允许每个命令使用前一个命令中生成的结果。我不会将其称为60年代的“弃用功能”。但早期的操作系统首先只知道顺序操作(但已经有了命令行),然后是并行执行。要在命令行上实现这一点,必须添加一些东西(
&
)作为标记。值得一提的是subprocess.Popen默认情况下不运行shell。它接受