首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python subprocess.Popen中的Shell脚本不会终止子进程

是因为Shell脚本在执行完毕后并不会自动终止子进程。这是因为subprocess.Popen方法默认创建的子进程是一个独立的进程,与父进程并不直接关联。

为了确保子进程在Shell脚本执行完毕后能够正确终止,可以使用subprocess.Popen对象的wait方法等待子进程执行完毕,并获取其返回值。wait方法会阻塞父进程,直到子进程执行完毕。

以下是一个示例代码,展示了如何使用subprocess.Popen执行Shell脚本并等待子进程终止:

代码语言:txt
复制
import subprocess

# 执行Shell脚本
process = subprocess.Popen(['sh', 'script.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 等待子进程执行完毕
stdout, stderr = process.communicate()

# 获取子进程的返回值
return_code = process.returncode

# 输出子进程的标准输出和标准错误
print(stdout.decode('utf-8'))
print(stderr.decode('utf-8'))

# 输出子进程的返回值
print(return_code)

在上述示例中,我们使用subprocess.Popen方法执行了一个名为script.sh的Shell脚本。通过communicate方法获取了子进程的标准输出和标准错误,并使用returncode属性获取了子进程的返回值。最后,我们将这些结果打印出来。

需要注意的是,如果Shell脚本中存在长时间运行的命令或者需要用户输入的情况,使用wait方法可能会导致父进程长时间阻塞。为了避免这种情况,可以使用subprocess.Popen对象的terminate方法手动终止子进程。

总结起来,Python的subprocess模块提供了执行Shell脚本的功能,但需要注意使用wait方法等待子进程终止,或者使用terminate方法手动终止子进程,以确保子进程能够正确终止。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python模块--subprocess

代码中去执行一些系统命令,在执行python程序时,该模块会创建出一个子进程,来运行外部程序。     ...丢失), 往返行程的估计时间(以毫秒为单位):     最短 = 0ms,最长 = 0ms,平均 = 0ms subprocess.Popen()     上面几个函数都是Popen()的封装,主进程都会等待子进程执行完毕...,Popen()创建的子进程不会被等待,相当于异步执行。    ...1.Popen()创建的对象有多个方法,可以针对子进程执行个性化操作,例如: import subprocess import time time.clock() POPEN1 = subprocess.Popen....kill() # 终止子进程 POPEN1.terminate() # 终止子进程 POPEN1.send_signal() # 向子进程发送信号 pid属性包含了子进程的pid号     2.subprocess.Popen

67410

Python标准库06 子进程 (subprocess包)

从这个意义上来说,subprocess的功能与shell类似。 subprocess以及常用的封装函数 当我们运行python的时候,我们都是在创建并运行一个进程。...在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序(fork,exec见Linux进程基础)。...当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。 与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。...()           # 终止子进程 child.send_signal()    # 向子进程发送信号 child.terminate()      # 终止子进程 子进程的PID存储在child.pid...shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。

2.8K60
  • 并行处理(二)、subprocess模块

    需要说明的是,该方法在python3.x中才有。 subprocess.Popen(): 在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。...在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。...bufsize:缓冲区大小,可不用关心 stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误 shell:与上面方法中用法相同 cwd:用于设置子进程的当前目录 env:用于指定子进程的环境变量...的目录: >>> a = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='/root') 示例2,使用python执行几个命令: import...) child.poll() #检查子进程状态 child.kill() #终止子进程 child.send_signal() #向子进程发送信号 child.terminate() #终止子进程

    38710

    python—subprocess、gl

    像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。.../usr/bin/env python import subprocess child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True).../usr/bin/env python import subprocess child = subprocess.Popen("ping -c 3 www.baidu.com",shell=True)...()       # 终止子进程 child.pid               #存储子进程的PID 2.子进程的文本流控制 子进程的标准输入、标准输出和标准错误如下属性分别表示: child.stdin...child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本;communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成

    1.5K20

    【shell脚本】$ 在shell脚本中的使用

    shell脚本中 '$' 与不同的符号搭配其表示的意义也会不同 特殊标志符 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。...例如,第一个参数是$1,第二个参数是$2 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或函数的所有参数 $?...上个命令的退出状态 $$ 当前Shell进程ID $() 与 `(反引号) 一样用来命令替换使用 ${} 引用变量划分出边界 注释:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" "...)包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。...但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

    6.2K20

    Python模块之subprocess

    二 基础知识 Python2.4引入subprocess模块来管理子进程,可以像Linux 系统中执行shell命令那样fork一个子进程执行外部的命令,并且可以连接子进程的output/input...与上面第二部分介绍的三个函数不同,subprocess.Popen() fork子进程之后主进程不会等待子进程结束,而是直接执行后续的命令。...Popen.terminate() 终止子进程。 Popen.kill() 杀死子进程。 Popen.pid 获取子进程的进程ID。...那么坑爹的问题来了:当你要使用Python的subprocess.Popen实现命令行之间的管道传输,同时数据源又非常大(比如读取上GB的文本或者无尽的网络流)时,官方文档不建议用wait,同时communicate...五 参考资料 [1] 官方文档 [2] Python中的subprocess与Pipe [3] python类库31[进程subprocess]

    2K10

    在python脚本中执行shell命令的方法

    在python脚本中执行shell命令的方法 最近在写python的一些脚本,之前使用python都是在django中使用,可能大部分内容都是偏向于后端开发方面的,最近在写一些脚本的时候,发现了...使用Python处理一个shell命令或者一个执行一个shell脚本,一般情况下,有下面三种方法,下面我们来看: 第一种方法是使用os.system的方法 os.system("cmd") 我们在当前目录下面创建一个...aaa.sql的文件,文件中的内容是aaa,然后我们来看测试过程 1[root@ /data ]$python 2Python 2.7.15 (default, Nov 29 2018, 13:37...,可以得到一个脚本或者一个命令的返回值和执行结果,当然,我们也可以使用下面的方法来分别校验aaa.sql文件是否存在,以及查看aaa.sql的执行结果: 1[root@ /data]$python 2Python...] 7else: 8 result["result"] = false 9 result["message"] = res 10return Response(result) 如果脚本中是对数据库的一系列操作

    5.3K00

    python的subprocess模块

    需要说明的是,该方法在python3.x中才有。 call()方法启动的进程,其标准输入输出会绑定到父进程的输入和输出。调用程序无法获取命令的输出结果。...如通过为stdin, stdout和stderr传递不同的参数。 subprocess.Popen(): 在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。...() #终止子进程 与进程的单向通信 通过Popen()方法调用命令后执行的结果,可以设置stdout值为PIPE,再调用communicate()获取结果 返回结果为tuple....在python3中结果为byte类型,要得到str类型需要decode转换一下 直接执行命令输出到屏幕 ​ subprocess.Popen("ls -l",shell=True) ​ subprocess.Popen...close_sfs:在Windows平台下,如果close_sfs被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道 所以不能将close_fds设置为True同时重定向子进程的标准输入

    3.1K20

    shell脚本中$符号的意义

    // shell脚本中$符号的意义 // 今天是远程办公的第4天,渐渐的找到了一点在家办公的节奏了,改了几个shell脚本,在改动过程中,发现还有一些知识点需要巩固,这里写出来,加深下印象。...关于$符号,大家肯定都不陌生,在shell脚本中,$的作用还是比较大多的,这里将所有的$组合都列出来,大家可以看下效果。 $组成的命令大概有下面几个: $0,$1...$?,$!...sleep 10的命令,脚本运行完会睡眠10s,脚本中打印出来了值60658,此时我们查看当前脚本的进程号,发现子进程的进程id是60658 4 $*和$@ 这两个放在一起,主要是因为他们都代表引用的所有参数...该命令是显示shell脚本中上一个后台执行命令的进程id号,如下: jwfyyzdembp:tmp jwfyyz$ cat test.sh echo '$*的结果是':$* echo '$@的结果是'...反应的是脚本中某个命令的进程号。

    4.4K10

    Shell脚本中的 DevNull 用途

    在命令行和脚本中都非常有用 用途 /dev/null 通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成,任何你想丢弃的数据都可以写入其中 丢弃标准输出 在写shell脚本的时候...,只想通过命令的结果执行后面的逻辑,而不想命令执行过程中有一大堆中间结果输出,这时候可以把命令执行过程中的输入全部写入 /dev/null 现有 a.sh 脚本,它的功能是判断传入的系统命令是否存在,脚本内容如下...丢弃标准错误输出 在shell脚本中,删除一个文件的时候,需要先判断文件是否存在,然后才能执行删除操作,否则删除的时候会输出错误, 一般的删除文件脚本内容如下: #!...,为了方便调试,经常会加一些日志打印的逻辑,有时这种调试日志还比较多,脚本测试通过之后,这些调试日志可能就删除或者注释掉了 这里提供一个小技巧,既不用删除也不用注释掉日志,同时执行脚本的时候还不会输出这些调试日志...比如: 当前目录有一个日志文件 log.txt,脚本的调试日志会以 echo " this is debug log" >> log.txt 的形式写入这个文件中 现在脚本功能测试通过了,调试日志不需要写入

    1.2K20

    Makefile中的Shell脚本简介

    给很多刚接触Makefile的人: 1、Makefile中可以嵌入shell脚本,而且能像shell脚本中一样,各种命令、控制结构都可使用。 2、Makefile的主要结构是 ......只有在command位置的shell脚本才是有效的,也就是只有在“生成目标的规则处”写的shell脚本才是shell脚本,其它位置的shell都是无效的。...3、Makefile中的shell,不同的行在不同的进程中执行,不同的行直接不能传递变量,所以很多时候shell都尽量使用反斜杠()来把相关的内容串成一行。...4、Makefile变量和shell变量是两个不同的东西,并且为了避免Makefile变量和shell变量冲突,引用Makefile变量最好使用$(Makefile_Var),引用shell变量时最好使用...但如果在纯粹的shell编程中,纯shell脚本里可以使用$VAR来引用VAR这个变量。 收藏于 2012-08-08

    2.1K80
    领券