广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python:执行命令行指令
  • 850
分享到

Python:执行命令行指令

python 2023-09-30 11:09:18 850人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

文章目录 简介os.systemos.popensubprocess.Popen()参考文献 简介 在python中,调用外部命令行(linux中的shell、或者windows中的cmd

文章目录

简介

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

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

os.system

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

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

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

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

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

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

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

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

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

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

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

输出:

/home/ttss0

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

os.popen

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

调用格式:

os.popen(command, mode, bufsize)

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

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

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

import osa=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 oswith 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新增的功能有:

  • wait():手动阻塞主进程,等待子进程返回后,再执行下面的代码;
from subprocess import Popen, PIPEp = Popen('sleep 100', stdout=PIPE, shell=True)p.wait()print('End')
  • pid():返回子进程的PID;
from subprocess import Popen, PIPEp = Popen('sleep 100', stdout=PIPE, shell=True)print(p.pid)
  • poll():检查子进程是否已经执行成功,没结束则返回None,结束则返回状态码。这个用处很大
#-*- coding:utf-8 -*-import timefrom subprocess import Popen, PIPEp = 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, PIPEp = Popen('sleep 100', stdout=PIPE, shell=True)print(p.pid)p.kill()
  • terminal():终止子进程,跟kill()差不多
from subprocess import Popen, PIPEp = Popen('sleep 100', stdout=PIPE, shell=True)print(p.pid)p.terminate()
  • communicate():用于跟子进程进行交互,返回一个元组,包含stdout、stderr;
from subprocess import Popen, PIPEp = Popen('cat', stdin=PIPE, stdout=PIPE, shell=True)print(p.communicate('hello world'))
  • stdout.readlines():读取标准输出,一次性读取所有内容
from subprocess import Popen, PIPEp = 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()多进程

来源地址:https://blog.csdn.net/wlh2220133699/article/details/131411260

--结束END--

本文标题: Python:执行命令行指令

本文链接: https://www.lsjlt.com/news/421839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python:执行命令行指令
    文章目录 简介os.systemos.popensubprocess.Popen()参考文献 简介 在python中,调用外部命令行(linux中的shell、或者windows中的cmd...
    99+
    2023-09-30
    python
  • python执行cmd命令
    最典型的模块 一,执行cmd并读取返回值 import subprocess p = subprocess.Popen("ls", stdout=subprocess.PIPE, universal_newl...
    99+
    2023-01-31
    命令 python cmd
  • python paramiko 执行命令
    参考http://wangwei007.blog.51cto.com/blog/68019/1058726http://youzao.blog.51cto.com/3946111/1348903在node1上想对node2执行命令,标准的答...
    99+
    2023-01-31
    命令 python paramiko
  • Java.Utils怎么执行命令行命令
    小编给大家分享一下Java.Utils怎么执行命令行命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Spring...
    99+
    2023-06-14
  • python远程执行命令
    import paramiko def sshclient_execmd(hostname, port, username, password, execmd):     paramiko.util.log_to_file("paramik...
    99+
    2023-01-31
    命令 python
  • python之执行shell命令
    [root@s141 ~]# python Python 2.7.5 (default, Sep 15 2016, 22:37:39)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Ty...
    99+
    2023-01-31
    命令 python shell
  • python 执行外部命令
     在Python环境下,执行一条外部命令一般有这么几个: 1、os.system(command)或者os.popen(..........) 2、wx.Execute(command, syn=wx.EXEC_ASYNC, callbac...
    99+
    2023-01-31
    命令 python
  • python 之 shell命令执行
    python中有几种常用的执行shell命令的模块1,os.system()2, os.popen()3,pexpect.run()下面介绍3个模块的差别1,os.system() 直接执行>>> os.system('l...
    99+
    2023-01-31
    命令 python shell
  • python下执行cmd命令
    使用os import os result = os.popen("ipconfig") print (result.read()) 这种方式有返回值,因而使用起来较为方便 ...
    99+
    2023-01-31
    命令 python cmd
  • Linux命令行循环执行shell命令
    目录linux命令行,循环执行shell命令死循环命令格式效果普通计数循环循环10次效果LLinux命令行,循环执行shell命令 死循环 命令格式 while true ;do <command>; don...
    99+
    2023-01-03
    linuxshell循环执行命令 循环执行shell命令 linux命令行 Linuxshell循环命令 while死循环
  • ctfshow 命令执行
    目录 web29 web30 web31 web32 web33 web34 web35 web36 web37 web38 web39 web40 web41 web42 web43 web44 web45 web46 web47 we...
    99+
    2023-08-31
    网络安全 安全 web安全
  • python怎么执行shell命令
    在Python中可以使用`os`模块中的`system`函数来执行Shell命令。以下是一个示例:```pythonimport o...
    99+
    2023-09-27
    python shell
  • Python 执行Shell 外部命令
    1、os.system()此方法执行的外部程序,会将结果直接输出到标准输出。os.system的返回结果为执行shell 的 $ 值。因此请执行没有输出结果的程序时适合使用此方法。如touch 、rm 一个文件等。In [1]: impor...
    99+
    2023-01-31
    命令 Python Shell
  • python 外部命令执行--OS
     Python 也可以通过os、subprocess执行外部shell命令对POSIX类型系统进行操作。  os 一个很强大的命令,可以通过os下的一些方法去执行shell命令,并且可以对对象执行完的标准输出、标准输入和标准错误输出进行操...
    99+
    2023-01-31
    命令 python OS
  • python 执行 shell命令 的几
        os.system 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0 或者 1,当然不满足需求了。 ...
    99+
    2023-01-31
    命令 python shell
  • python 执行系统命令(curl)
    使用python执行系统命令,比如curl直接上货:#!/usr/bin/python # -*- coding: UTF-8 -*- import os data = ['www.baidu.com', 'www.cs...
    99+
    2023-01-31
    命令 系统 python
  • python怎么执行cmd命令
    在 Python 中执行 cmd 命令,可以使用 `os` 模块中的 `system()` 或 `popen()` 方法。下面是使用...
    99+
    2023-09-22
    python
  • java如何执行(命令执行)
    执行java文件方法:(相关视频教程推荐:java视频教程)使用环境:jdk1.6文件目录:javac *.java会生成对应的*.class文件java *.class就可以执行了,.class可以省略t.java中是没有包的public...
    99+
    2019-10-16
    java
  • 【python】os.system() & os.popen() 在 python 执行 cmd 指令
    先说总结 os.system:获取程序执行命令的返回值。os.popen: 获取程序执行命令的输出结果。commands:获取返回值和命令的输出结果。 1 os.system() 这个方法是直接调用标...
    99+
    2023-09-11
    python linux 服务器
  • 怎么在dos命令行中执行cd命令
    今天就跟大家聊聊有关怎么在dos命令行中执行cd命令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。显示当前目录名或改变当前目录。 CHDIR [/D] [drive:][path] ...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作