首页
学习
活动
专区
工具
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

66910

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(): 在一些复杂场景,我们需要将一个进程执行输出作为另一个进程输入。...在另一些场景,我们需要先进入到某个输入环境,然后再执行一系列指令等。这个时候我们就需要使用到suprocessPopen()方法。...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() #终止子进程

    36010

    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。...那么坑爹问题来了:当你要使用Pythonsubprocess.Popen实现命令行之间管道传输,同时数据源又非常大(比如读取上GB文本或者无尽网络流)时,官方文档不建议用wait,同时communicate...五 参考资料 [1] 官方文档 [2] Pythonsubprocess与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

    pythonsubprocess模块

    需要说明是,该方法在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同时重定向子进程标准输入

    3K20

    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.3K10

    MakefileShell脚本简介

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

    2.1K80

    Shell脚本 DevNull 用途

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

    1.2K20
    领券