Python:执行命令行指令

这篇具有很好参考价值的文章主要介绍了Python:执行命令行指令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

在python中,调用外部命令行(linux中的shell、或者windows中的cmd)来执行指令,常用的有三种方式:

  • os.system(‘pwd’);
  • os.popen()
  • subprocess.Popen()

os.system

是os模块中最基础的部分,其他的方法一般是在该方法的基础上衍生来的。

每一条os.system指令在执行时,都会创建一个子进程在系统上来执行命令,子进程的执行结果是无法影响主进程的;

上述原理会导致当需要执行多条命令行的时候会得不到想要的结果,比如说:

import os

os.system('cd /home/xxx/')
os.mkdir('1.txt')

执行后会发现txt文件没有创建在/home/xxx/文件夹,而是创建在了本地,因为多条命令是独立的。

如果为了保证system执行多条命令可以成功,那么多条命令需要在一个os.system中执行,但需要用特殊的分隔符将它们隔开,如:

import os

os.system('cd /home/xxx/ && mkdir 1.txt')
os.system('cd /home/xxx/ ; mkdir 1.txt')
  • 分号表示,这些命令会顺序执行下去;

  • &&表示,顺序执行,遇到执行错误的命令停下;

  • ||表示,顺序执行,遇到执行成功的命令停止,后面不再执行;

os.system还有一个缺点,就是它的返回值只有0(成功),1,2。他对pwd等指令是会打印出执行结果,但是这个结果是内部打印出的,不是以返回值的形式打印出的,我们根本拿不到。比如说:

import os
a=os.system('pwd')
print(a)

输出:

/home/ttss
0

如果无法忍受这个问题,那么可以考虑使用os.popen()

os.popen

os.popen()是打开一个管道来执行命令,并将命令的执行结果写入一个文件对象作为返回值。

调用格式:

os.popen(command, mode, bufsize)

command是待执行命令,后面两个命令可选;

mode,指示模式权限,r或者w,默认是r;

bufsize,指明了文件需要的缓冲大小。0表示无缓冲,1表示行缓冲;其他正值表示使用参数大小的缓冲,以字节为单位;负值表示使用系统的默认值。可以使用默认

import os

a=os.popen('pwd', 'r').readlines()
print a

# 输出:
# ['/et/ttss\n']

我们可以对返回的文件对象做继续操作。

这里需要注意两个地方:

  • 关闭文件对象;
  • 设置阻塞

返回的文件对象是需要关闭的,因此规范的写法是在with语句里使用os.popen

with os.popen(command, 'r') as p:
    r = p.read()

就不需要再手动的写p.close()

而且上面那种方式还有好处,就是利用read()的特性阻塞住主进程,只有子进程跑完了之后才能继续向下执行。

但是这也带来了一个坏处,主进程会被完全卡住,直到子进程跑完了之后,主进程才能read成功,接着往下执行。所以如果子进程永远也结束不了的话,那么主进程就会一直这么卡着。。。

比如说ping 127.0.0.1,默认是一直在执行的,然后我们:

import os

with os.popen('ping 127.0.0.1', 'r') as p:
        for i in p.readlines():
                print(i)
print('执行完成')

执行后前台就会一直卡着,也没有输出,因为子进程没有结束,所以主进程也拿不到任何返回值。。。。

除了这个地方比较坑之外,popen()还是比较好用的,自己注意下就行,千万不要执行无法退出的命令、或者需要进入交互模式的命令。

subprocess.Popen()

功能最丰富的一种方式,一般是推荐使用这个。

但是仍然做不到子进程边执行边输出哈

感觉相比os.popen(),新增的功能有限,就是可以跟子进程交互了而已,如果不过分追求这一点的话,那么感觉也可以选择用os.popen()

subprocess新增的功能有:文章来源地址https://www.toymoban.com/news/detail-731022.html

  • wait():手动阻塞主进程,等待子进程返回后,再执行下面的代码;
from subprocess import Popen, PIPE

p = Popen('sleep 100', stdout=PIPE, shell=True)
p.wait()
print('End')
  • pid():返回子进程的PID;
from subprocess import Popen, PIPE
p = Popen('sleep 100', stdout=PIPE, shell=True)
print(p.pid)
  • poll():检查子进程是否已经执行成功,没结束则返回None,结束则返回状态码。这个用处很大
#-*- coding:utf-8 -*-

import time
from subprocess import Popen, PIPE

p = Popen('sleep 100', stdout=PIPE, shell=True)

while True:
    if p.poll() == None:
        print('程序执行中...')
        time.sleep(1)
    else:
        print('程序执行完毕, 状态码为:%s' % p.poll())
        break
  • returncode():返回命令执行完之后的状态码。但是returnCode并不是实时刷新的,并不是每次调用就刷新这样子,而是显式执行一次p.poll()之后才会做刷新。

  • kill():杀死子进程
from subprocess import Popen, PIPE

p = Popen('sleep 100', stdout=PIPE, shell=True)
print(p.pid)
p.kill()
  • terminal():终止子进程,跟kill()差不多
from subprocess import Popen, PIPE

p = Popen('sleep 100', stdout=PIPE, shell=True)
print(p.pid)
p.terminate()
  • communicate():用于跟子进程进行交互,返回一个元组,包含stdout、stderr;
from subprocess import Popen, PIPE

p = Popen('cat', stdin=PIPE, stdout=PIPE, shell=True)
print(p.communicate('hello world'))
  • stdout.readlines():读取标准输出,一次性读取所有内容
from subprocess import Popen, PIPE

p = Popen('ls /home', stdout=PIPE, shell=True)
for line in p.stdout.readlines():
    print(line)

参考文献

  1. python基础之os.system函数
  2. python中的os.popen()
  3. python os.popen()方法 写的很棒
  4. os.system()和os.popen()概述
  5. subprocess.Popen() 常用方法 很棒
  6. python–subprocess.Popen()多进程

到了这里,关于Python:执行命令行指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python subprocess执行外部命令常用方法

    subprocess模块是Python标准库中的一个模块,用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法:subprocess.run(),subprocess.Popen() 1. subprocess.run()方法 subprocess.run()是subprocess模块中一个常用的函数,

    2024年02月06日
    浏览(41)
  • 一文看懂python如何执行cmd命令

      “  在进行Python编程时,经常需要使用到操作系统的命令行,这就要求我们学会如何使用Python执行cmd命令。 ”   Python是一种强大而灵活的编程语言,它可以很方便地执行系统命令,与操作系统进行交互。本文将介绍Python执行cmd命令的几种常用方法,以及它们的优缺点和使

    2024年02月16日
    浏览(40)
  • `sh -c`命令——解决命令权限问题、一条命令中执行多个指令

    sh -c 在Shell中执行一个字符串作为命令,可以在一条命令中执行多个指令。 其中, command 是要执行的命令或命令串。 **1、 sh -c 属于非交互模式 在终端上敲入命令就可以显示对应结果,这样与终端进行交互执行命令的方式就称为交互模式。 非交互模式就是调用 bash 解释器,通

    2024年03月12日
    浏览(45)
  • 使用 Python 连接 SSH 服务器并执行命令

    实际开发中,有时候经常需要查看日志,有时候使用ssh工具打开就为了看一下错误日志又比较麻烦,所以今天带来一个简单的基于python的小工具. 首先需要先安装一个库 paramiko 使用命令直接安装 paramiko库是一个开源的、基于SSH2协议的库,可以实现SSH连接以及数据的传输。 paramik

    2024年02月08日
    浏览(39)
  • 新的 Python URL 解析漏洞可能导致命令执行攻击

    Python URL 解析函数中的一个高严重性安全漏洞已被披露,该漏洞可绕过 blocklist 实现的域或协议过滤方法,导致任意文件读取和命令执行。 CERT 协调中心(CERT/CC)在周五的一份公告中说:当整个 URL 都以空白字符开头时,urlparse 就会出现解析问题。\\\"这个问题会影响主机名和方

    2024年02月12日
    浏览(40)
  • Python:执行py命令,提示: Can‘t find a default Python.

    今天,要运行一个前年用python编写的爬虫程序,先检测python运行环境是否正常: D:Python38-32worksc:windowspy.exe Can\\\'t find a default Python. 再试: D:Python38-32workspy --list Installed Pythons found by py Launcher for Windows No Installed Pythons Found! C:WINDOWSsystem32 assoc .py=Python.File C:WINDOWSsystem32ftype P

    2024年04月10日
    浏览(40)
  • 问题记录 | 执行python命令报错 713011 segmentation fault (core dumped) python

    最近在看DALLE2模型,新建conda虚拟环境之后使用命令 pip install dalle2_pytorch 安装,然后在MobaXterm中执行python命令,报错 但是在vscode中同样的命令能够顺利执行

    2024年02月13日
    浏览(38)
  • python执行cmd命令——控制电脑连接wifi——程序打包

    控制电脑连接wifi

    2024年02月05日
    浏览(51)
  • Java:Java程序通过执行系统命令调用Python脚本

    本文实现功能:Java程序调用Python脚本 直接执行 参考视频 JAVA开发必会小技巧8——用代码调用系统指令

    2024年02月14日
    浏览(58)
  • 【Python】在代码中执行终端命令并获取输出和运行状态

      在Python编程过程中,我们可能会遇到需要在终端命令行执行某个命令并获取其输出的操作,我们首先想到可能就是C语言中的 system(\\\"pause\\\"); 语句,确实,python当中也有类似的命令,同时,为了满足进一步的需求,比如判断指令是否执行完毕或者是得到执行输出的内容。  

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包