>

在子进程中执行command,方法只返回外部程序的运

- 编辑:澳门博发娱乐官网 -

在子进程中执行command,方法只返回外部程序的运

python cmd命令调用

关于python调用cmd命令:

驷比不上舌介绍三种方法:

1.python的OS模块。

  OS模块调用CMD命令有两种艺术:os.popen(),os.system(). 都以用当下历程来调用。

  os.system是回天无力获取重回值的。当运营甘休后继之往上边实施顺序。用法如:OS.system("ipconfig").

  OS.popen带再次回到值的,如何获得重返值。如

  p=os.popen(cmd)

  print p.read().得到的是个字符串。

  这三个都是用当下经过来调用,也正是说它们都是梗塞式的。

2.管道subprocess模块。

  运转原理会在脚下进程上边发生子进度。

  sub=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)

  sub.wait()

  print sub.read()

>>> os.popen('ls -lt')     # 调用os.popen(cmd)并不能得到我们想要的结果 
<open file 'ls -lt ', mode 'r' at 0xb7585ee8> 
>>> print os.popen('ls -lt').read()  # 调用read()方法可以得到命令的结果 
total 6064 
-rwxr-xr-x 1 long  long   23 Jan 5 21:00 hello.sh 
-rw-r--r-- 1 long  long   147 Jan 5 20:26 Makefile 
drwxr-xr-x 3 long  long   4096 Jan 2 19:37 test 
-rw-r--r-- 1 root  root  6030829 Dec 31 15:14 log 
drwxr-xr-x 2 long  long   4096 Dec 28 09:36 pip_build_long 
drwx------ 2 Debian-gdm Debian-gdm 4096 Dec 23 19:08 pulse-gylJ5EL24GU9 
drwx------ 2 long  long   4096 Jan 1 1970 orbit-long 
>>> val = os.popen('ls -lt').read()  # 使用变量可以接收命令返回值 
>>> if "log" in val:     # 我们可以使用in来判断返回值中有木有一个字符串 
...  print "Haha,there is the log" 
... else: 
...  print "No,not happy" 
... 
Haha,there is the log 

 

有时难免需求平昔调用Shell命令来成功部分比较简单的操作,比方mount二个文件系统之类的。那么大家接收Python如何调用Linux的Shell命令?上面来介绍两种常用的艺术:

        此函数会运维子进度,在子进度中施行command,并赶回command命令实施达成后的脱离状态
若果command有举办内容,会在正经八百输出显示。那事实上是接受C标准库函数system()完成的。
      system方法会创制子进程运维外界程序,方法只回去外界程序的周转情况。那个点子相比适用于表面程序还没出口结果的情事

运用commands模块的getoutput方法,这种办法同popend的差异在于popen重回的是贰个文件句柄,而本办法将表面程序的输出结果当做字符串再次回到,相当多景色下用起来要更方便人民群众些。
入眼措施: 

>>> a=os.system('ls')
1.py                   51.29.txt        dead.letter  error.txt      yue.csv
1.txt                  anaconda-ks.cfg  dengji.sh    kefuTongji.sh
>>> print a
0

4. 众主意的相比较以致计算

3.commands模块的  getoutput 方法

      这种方法同popend的不一样在于popen重临的是三个类公事对象,而本办法将表面程序的出口结果当做字符串重回,相当多处境下用起来要更实惠些。

器重方法:  

*   commands.getstatusoutput(cmd)         返回(status, output)
*   commands.getoutput(cmd)                   只回去输出结果
*   commands.getstatus(file)                     再次来到ls -ld file的施行结果字符串,调用了getoutput,不提出

 

>>> import commands

>>> commands.getstatusoutput('ls')

(0, '1.pyn1.txtn2016_澳门博发娱乐官网,11_28_access_logn51.29.txtnanaconda-ks.cfgndata.txtndead.letterndengji.shndiskJK,sh')

 

>>> commands.getoutput('ls')

'1.pyn1.txtn2016_11_28_access_logn51.29.txtnanaconda-ks.cfg'

 

>>> commands.getstatus('1.py')=ippi

'-rwxr-xr-x 1 root root 69 Jan 19 14:22 1.py'

 

 

>>> import os 
>>> os.system("echo "Hello World"") # 直接使用os.system调用一个echo命令 
Hello World   ——————> 打印命令结果 
0     ——————> What's this ? 返回值? 
>>> val = os.system("ls -al | grep "log" ") # 使用val接收返回值 
-rw-r--r-- 1 root  root  6030829 Dec 31 15:14 log ——————> 此时只打印了命令结果 
>>> print val    
0     ——————> 注意,此时命令正常运行时,返回值是0 
>>> val = os.system("ls -al | grep "log1" ") 
>>> print val   
256     ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~ 
>>> 

python程序中调用shell命令,是件非常帅且常用的作业
今日来总括一下

细心:上边说了,此办法脂肪会外界程序的结果,相当于os.system的结果,所以只要你想接收命令的重回值,接着向下看~

2.os模块的popen方法

        张开八个与command进度之间的管道。
其后生可畏函数的再次来到值是四个文本对象,能够读恐怕写(由mode决定,mode暗许是’r')。若是mode为’r',能够应用此函数的回到值调用read()来获取command命令的实行结果。
       当需求获得外界程序的出口结果时,本办法拾叁分有用,再次来到多个类公事对象,调用该对象的read()或readlines()方法能够读取输出内容。

>>> os.popen('ls')

<open file 'ls', mode 'r' at 0x7f365a5075d0>

 

>>> print os.popen('ls').read()

1.py

1.txt

 

>>>a=os.popen('ls').readlines()
>>>print a

['1.pyn', '1.txtn', '2016_11_28_access_logn', '51.29.txtn', 'anaconda-ks.cfgn']

 

 

1.3. os模块的popen方法

1.使用os模块 的  system

你也许感兴趣的篇章:

  • python+influxdb+shell编写区域网络处境表
  • Python设置在shell脚本中自动补全功用的章程
  • python和shell监控linux服务器的详尽代码
  • python和shell获取文本内容的点子
  • python 实施shell命令并将结果保存的实例
  • shell命令行,后生可畏键成立 python 模板文件脚本方法
  • 应用Python+Java调用Shell脚本时的死锁陷阱详整
  • 行使Python生成Shell命令,批量奉行程序代码剖析
  • python SSH模块登入,远程机施行shell命令实例深入分析
  • 用Python shell简化开辟

4.模块subprocess

使用stream = os.popen("some_command with args")也能做与os.system同样的事,与os.system差别的是os.popen会给你三个像文件的靶子从而你可以利用它来访谈哪个程序的正经八百输入、输出。並且popen还恐怕有多个变种都是在I/O管理上有轻微区别。要是你通过叁个字符串传递全数东西,你的吩咐会传递给shell;假如您通过七个列表传递他们,你不要顾虑逃匿任何事。

>>> import os
>>> os.system('ls')
1.py                   51.29.txt        dead.letter  error.txt      yue.csv
1.txt                  anaconda-ks.cfg  dengji.sh    kefuTongji.sh
0

os.system("some_command with args")将下令以至参数字传送递给你的种类shell,那很好,因为您能够用这种方法同期运营多个指令何况能够安装管道甚至输入输出重定向。举例:
os.system("some_command < input_file | another_command > output_file")
不过,就算这很有利,然而你需求手动管理shell字符的转义,例如空格等。其它,那也只能让您运营简单的shell命令况且不能够运转外界程序。

         subprocess目的在于代表其余多少个老的模块也许函数, 举例:os.system os.spawn*  os.popen*  popen2.* commands.*

       依据Python官方文书档案表达,subprocess模块用于代替下面这几个模块。有四个用Python完结的并行ssh工具—mssh,代码很简短,可是很有趣,它在线程中调用subprocess运转子进度来干活

 

subprocess.波普n('脚本/shell', shell=True)        无拥塞、和主程序并行运转
subprocess.call('脚本/shell', shell=True)              必得等等候命令令实践达成

 

>>> import subprocess

>>> subprocess.Popen("ls")

1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv

<subprocess.Popen object at 0x7fda1a0fcc50>

 

>>> a=subprocess.Popen("ls")

1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv

>>> print a

<subprocess.Popen object at 0x7fda1a0fcc90>

>>>subprocess.Popen('. xxx.sh', stdout = subprocess.PIPE, shell = True).stdout.read()

'1.pyn1.txtn2016_11_28_access_logn51.29.txtn'

 

  1. p = subprocess.Popen("python stdTest.py",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)  
  2. sout = p.stdout.readlines()  
  3. serr = p.stderr.readlines()  
  4. print sout  
  5. print serr  

 

 

 

>>> subprocess.call("ls")

1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv

 

>>> a=subprocess.call("ls")

1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv

>>> print a

0

 

 

>>> from subprocess import call

>>> call(["ls","-l"])

total 2972

-rwxr-xr-x 1 root root     220 Jan 17 22:33 1.sh

 

 

 

计算一下:

1.os.system            命令行能够出口运转内容,但不能不回去运维景况

2.os.popen             重回贰个类公事对象,能够从此以往文件读取输出内容

3.commands.get    不仅能重回输出内容,也能回到运作结果情状

4.subprocess          不仅可以重临输出内容,也能回到运营结果情形

 

1.1. os模块的exec方法族

 

本文由胜博发-编程发布,转载请注明来源:在子进程中执行command,方法只返回外部程序的运