1. 程式人生 > >Python之使用subprocess處理shell命令

Python之使用subprocess處理shell命令

Python學習之使用subprocess處理shell命令

前言

在公司的專案中,遇到了一個場景,我們需要重新對資原始檔合併生成R.java檔案,在windows環境下,直接通過命令列來操作很簡單,那麼每次都需要這樣做是不是很麻煩呢,而如果我們使用Python寫一個處理命令列的指令碼,那麼以後我們每次只要呼叫一下這個指令碼就好了。

subprocess

在Python中,提供了subprocess模組,通過這個模組中的相應API,就可以開啟一個子程序來執行相應的指令碼來完成這個操作。
可以通過subprocess中的Popen類來處理這個命令。

其中部門原始碼如下,我們通過構造方法,瞭解一下其中主要的引數的作用。

import subprocess

class Popen(object):

    _child_created = False  # Set here since __del__ checks it

    def __init__(self, args, bufsize=-1, executable=None,
                 stdin=None, stdout=None, stderr=None,
                 preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
                 shell=False, cwd=None, env=None, universal_newlines=False,
                 startupinfo=None, creationflags=0
, restore_signals=True, start_new_session=False, pass_fds=())
:
"""Create new Popen instance."""

下面是部分常用的引數的意思:

引數 作用
args 一般是一個字串,是要執行的shell命令內容
bufsize 設定緩衝,負數表示系統預設緩衝,0表示無緩衝,正數表示自定義緩衝行數
stdin 程式的標準輸入控制代碼,NONE表示不進行重定向,繼承父程序,PIPE表示建立管道
stdout 程式的標準輸出控制代碼,引數意義同上
stderr 程式的標準錯誤控制代碼,引數意義同上,特殊,可以設定成STDOUT,表示與標準輸出一致
shell 為True時,表示將通過shell來執行
cwd 用來設定當前子程序的目錄
env 設定環境變數,為NONE表示繼承自父程序的
universal_newlines 將此引數設定為True,Python統一把這些換行符當作’/n’來處理。

例項程式碼

下面演示通過subprocess的Popen來實現,通過命令列建立一個Android的工程專案。


# -*-coding:utf8-*-
import subprocess


def execute_command(cmd):
    print('start executing cmd...')
    s = subprocess.Popen(str(cmd), stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    stderrinfo, stdoutinfo = s.communicate()
    print('stderrinfo is -------> %s and stdoutinfo is -------> %s' % (stderrinfo, stdoutinfo))
    print('finish executing cmd....')
    return s.returncode


cmd = r'D:\sdk\tools\android.bat create project --target 8  --name source2apk --path D:\HelloCSDN\ --package com.csdn.lhy --activity MainActivity'
result = execute_command(cmd)
print('result:------>', result)

執行結果如下,可以看到我們在相應的目錄下建立這個程式成功了:

C:\Python34\python.exe D:/python_demo/self_study/subprogress_cmd.py
start executing cmd...
stderrinfo is -------> b'Created project directory: D:\\HelloCSDN\nCreated directory D:\\HelloCSDN\\src\\com\\csdn\\lhy\nAdded file D:\\HelloCSDN\\src\\com\\csdn\\lhy\\MainActivity.java\nCreated directory D:\\HelloCSDN\\res\nCreated directory D:\\HelloCSDN\\bin\nCreated directory D:\\HelloCSDN\\libs\nCreated directory D:\\HelloCSDN\\res\\values\nAdded file D:\\HelloCSDN\\res\\values\\strings.xml\nCreated directory D:\\HelloCSDN\\res\\layout\nAdded file D:\\HelloCSDN\\res\\layout\\main.xml\nAdded file D:\\HelloCSDN\\AndroidManifest.xml\nAdded file D:\\HelloCSDN\\build.xml\nAdded file D:\\HelloCSDN\\proguard-project.txt\n' and stdoutinfo is -------> b''
finish executing cmd....
result:------> 0

Process finished with exit code 0

相關推薦

Python使用subprocess處理shell命令

Python學習之使用subprocess處理shell命令 前言 在公司的專案中,遇到了一個場景,我們需要重新對資原始檔合併生成R.java檔案,在windows環境下,直接通過命令列來操作很簡單,那麼每次都需要這樣做是不是很麻煩呢,而如果我們使

Python使用adb shell命令啟動應用

一直有一個心願希望可以用Python做安卓自動化功能測試,在一步步摸索中,之前是用monkeyrunner,但是發現對於控制元件ID的使用非常具有侷限性,尤其是ID的內容不便於區分 具有重複性時,後面又發現Uiautomator可以對resorceId、text、packa

python異常處理

value display 數值計算 錯誤 獲得 生成器 rec 縮進 路徑問題 第一:什麽是異常 異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不

pythonsubprocess

world imp oot int shell. root let nbsp 發送數據 官網介紹:https://docs.python.org/3/library/subprocess.html Popen(): [[email protected]/* *

15、Python異常處理

工作 else OS gpo 錯誤 所有 分享 數據 業務 異常處理 1、 異常處理是所有語言都不可缺少的部分,我們在編寫代碼的時候,有時候會預期到某段代碼可能會發生錯誤,如果錯誤發生了,我們通過異常捕獲,來對發生異常的代碼進行後續處理,比如有一段連接數據庫的代碼,這

Python日誌處理 logging模塊

python模塊 遠程 找到 調試 寫入 例如 doc 屬性設置 stream 本節內容 日誌相關概念 logging模塊簡介 使用logging提供的模塊級別的函數記錄日誌 logging模塊日誌流處理流程 使用logging四大組件記錄日誌 配置loggin

python異常處理,斷言和反射

pyc python 存在 ase module 定義 sat gif 機制 1、異常基礎 python在運行過程中,程序解釋機制會測試代碼,如檢測不通過則會拋出異常。 try: aa = 10 bb = ‘10‘ cc = aa

python異常處理,斷言

一,異常和錯誤 part1:程式中難免出現錯誤,而錯誤分成兩種 1.語法錯誤(這種錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正) #語法錯誤示範一 if #語法錯誤示範二 def test: pass #語法錯誤

Python異常處理(執行python檔案時傳入引數)

使用sys模組 使用sys模組裡的argv引數,用來儲存引數值 import sys #sys.argv的作用是獲取到執行python檔案時,傳入的引數 #預設如果執行python檔案不傳引數,argv裡面只有一個引數,就是當前這個檔案的檔名 import flask server=

Python 異常處理機制

python在程式執行出現錯誤時時有相應的反應機制 ,我們可以針對不同的錯誤做出不同的響應 1 list1 = ['a','b','c'] 2 print(list1[4]) #>>>IndexError: list index out of range 3 a =

python-crontab自動任務執行python指令碼中的shell命令

在crongtab -e 中 新增以下,原因環境變數問題 LANG=zh_CN.UTF-8 SHELL=/bin/bash PATH=/bin:/usr/bin:/usr/local/bin:/usr/sbin * * 1 * * python 123.py 有時候可

Python日誌處理(logging模組)

本節內容 日誌相關概念 logging模組簡介 使用logging提供的模組級別的函式記錄日誌 logging模組日誌流處理流程 使用logging四大元件記錄日誌 配置logging的幾種方式 向日志輸出中新增上下文資訊 參考文件 一、日誌相關概念 日誌是

pythonsubprocess.Popen常用情況

import subprocess #最基本的啟動程序方式類似cmd下執行: notepad.exe text.txt 命令 obj = subprocess.Popen(['notepad.exe','text.txt'], shell = True, st

小白學python錯誤處理_學習筆記

本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。 本文是學習到python的定製類。參考連結廖雪峰python錯誤處理。 本學習筆記僅供參考。 筆記: 在作業系統提供的呼叫中,返回錯誤碼非常常見。 比如,開啟檔案的函式op

python 執行多條shell命令

使用py時可能需要連續執行多條shell 命令 1. # coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8'

python subprocess模組

原文連結: http://blog.csdn.net/halazi100/article/details/42556471 從python2.4版本開始,可以用subprocess這個模組來產生子程序,並連線到子程序的標準輸入/輸出/錯誤中去,還可以得到子程序的返回值。

pythonsubprocess.Popen執行命令並持續獲取返回值

轉自 :http://blog.sina.com.cn/s/blog_44d19b500102x21i.html 先舉一個Android查詢連線裝置的命令來看看Python中subprocess.Popen怎麼樣的寫法。用到的命令為 adb devices。   i

Linux基礎bash shell命令

lin com 子目錄 軟鏈接 node 並不會 包含 tail命令 linux系統 linux系統構成 linux內核主要負責 系統內存管理 軟件程序管理 硬件設備管理 文件系統管理 GNU工具 執行一些標準功能,比如控制文件和程序。又分為核心工具和shell. 大

hadoophdfs的shell命令操作

FS Shell呼叫檔案系統(FS)Shell命令應使用 bin/hadoop fs <args> 的形式。 所有的的FS shell命令使用URI路徑作為引數。URI格式是scheme://authority/path 。對 HDFS檔案系統,scheme是h

Python時間處理

一.關於時間幾種常用的處理方法(time包和datetime包) (1)引入time包,import time 1.獲取從1970年到現在的秒數,至於為什麼從1970年開始這裡就不過多闡述了(我不會告訴你其實我也不知道) timeLine = time.time() p