`

Python subprocess example1

阅读更多

This article is based on the official document on the subprocess module.  you can find the article on subprocess module in this link: http://docs.python.org/library/subprocess.html#module-subprocess

 

a blurb on subprocess module.

 

 

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:

os.system
os.spawn*
os.popen*
popen2.*
commands.*

Information about how the subprocess module can be used to replace these modules and functions can be found in the following sections.

 

 

Below shows some code that utilize the subprocess module to start a number of process, it will close the subprocess on receiving input from the command line.

 

'''
File:
    start_command.py
description:
    This script is suppose to start some script/commands given the specified number of instance
    where you can also specify the location to the command to start.
argumnents;
    -n the # of instance of the command to start
    -p the location to the command
    -a the command argument
    
'''


# this will give us 
#     types.IntType
#     types.FloatTypes        
# more details, pls have a read 
#  http://docs.python.org/library/types.html
#  
from types import *

# this will give access to the symbols
#   sys.argv
#   sys...
# Joe - 
# we recommended that directly use fully qualified symbols
# 
# from sys import *


import sys


# os module
# which has the command 'os.pipe' ... 
# declared, 
# more details, pls find it here:
#   http://docs.python.org/library/os.html
import os


# apparently, the fork command is not well available on the Windows Platform
# you might give some consideration to the multiprocessing module, more details see
#    http://docs.python.org/library/multiprocessing.html
#
# 
import multiprocessing


# time module
# time module has methods such as 'time.sleep(secs)',
# time.strftime(format[,t]) and etc
import time

# subprocess module
# subprocess module allows you to spawn new processes, connect to their input/putput/error pipes
# and obtain their return values
# this module intends to replace several others, older module and functions, such as ...
# see more details 
#   http://docs.python.org/library/subprocess.html#module-subprocess
# 
import subprocess


# the doc string is mimic of the 
# doc string that is exemplified under this doc
#  http://stackoverflow.com/questions/256222/which-exception-should-i-raise-on-bad-illegal-argument-combinations-in-python
def check(n, p, a=None):
    """
    :param n: the # of instance to start
    :param p: the path to the Command/Script to start
    :param a: this is optional argument, default value of a is `None`
    :raise TypeError: if `type(n) is not int or type(p) is not str`
    :raise ValueError: if `n <= 0 or p == ""`
    :return None
    """


# about the parameter of the python argument
# there are 4 types of argument that a Python Fucntino that can accept
# they are
#   1. fixed argument (or called non-default argument) 
#   2. the positional arguments
#   3. the keyword arguments
#   4. the default arguments ( a special case of keyword argument)
#
# the syntax to define python function is as follow
#    func_name(a, b, ..., [*args | default=default_values]], **kwargs)
# 
#  so the general rule of defining python argument is as follow
#      def func_name(a, b, ..., *args, **kwargs)
# however, it is quite confusing when the default value for a argument comes into the play
# to declare a default argument, you normally do this 
#      def func_name(a, b, ..., *args, default=default_value)
# because the default value for an argument syntactically looks like the keyword argument
# which means
#    1. you cannot have default argument before the positional argument
#        def func_name(a, b, ..., default=default_value, *args) # raise TypeError
#    2. it is not allowed if to have default argument in the middle of fixed argument
#        def func_name(a, ..., default=default_value, b, ..., *args) # raise TypeError
#    3. you cannot have both positional argument and default argument together...
#        def func_name(a, b, *args, default="default_value") # raise TypeError
#        def func_name(a, b, default=default_value", *args, **kwargs) # raise TypeError
#    4. You can have an argument with default value after the positional argument and before the 
#       keyword argument (**kwargs) (you can think default valued argument is a special form of
#       keyword argument.  
#         def func_name(a, b, ..., default=default_value, **kwargs)
#    5. As said in 4, if you try to put the default argument after the keyword arguments, it fails
#         def func_name(a, b, ..., **kwargs, default=default_value);


    assert(n is not None and n > 0)
    assert(p is not None and p != "")
    assert(a is None or a != "")
    
    
    if (not isinstance(n, int)): raise TypeError("Argument 'n' expect integer")
    if (n is None or n <= 0): raise ValueError("Argument 'n' invalid");
    if (a is not None):
        if (type(a) != StringType): raise TypeError("Argument 'a': expect string")
        if (type(a) is not StringType): raise TypeError("Argument 'a': expect string")
        if (type(a) != str): raise TypeError("Argument 'a': expect string")
        if (type(a) is not str): raise TypeError("Argument 'a': expect string")
        # while this is wrong, because is is like identity equal operator
        # it is like 
        #     a is b
        #  is equivalent
        #     id(a) == id(b)
        # 
        # if (a is not str): raise TypeError("Argument 'a': expect string")
        if (not isinstance(a, str)): raise TypeError("Argument 'a': expect string")
        if (not (type(a) in [str, unicode])): raise TypeError("Argument 'a': expect string")
    pass





def initializeList(size, value=None):
#    l = [None] * size
    l = []
    for i in range(size):
        l.append(value)
    return l
    
def initializeList2(size, value=None):
    return [value] * size; 


def debugArgument(n, p, a):
    check(n, p, a)
    
    print "-n={0}".format(n)
    print "-p={0}".format(p)
    if (a is not None):
        print "-a={0}".format(a)

def parseArguments(args):
    assert(args is not None)
    
    if (args is None): raise ValueError("args: Invalid value!")
    
    # the first argument of args is the name of the program
    #    [0]: start_command.py
    # 
    # you can also skip the first argument of the sequence.
    
    a = dict({})
    print "len(args) = {0}".format(len(args))
    
    # let's drop the first element
    # it is the same as writting as 
    #   args[1::]
    #
    args = args[1:];

    for i in range(0, len(args), 2):
        if (args[i] == "-n"): a[args[i]] = int(args[i+1])
        elif (args[i] == "-p"): a[args[i]] = args[i+1]
        elif (args[i] == '-a'): a[args[i]] = args[i+1]
        else: raise ValueError("Invalid args: Unrecognized option {0}".format(args[i]))

    return a



def main():
    
    args = parseArguments(sys.argv);
 
    
    n = args["-n"] if args.has_key("-n") else None
    p = args["-p"] if args.has_key("-p") else None
    a = args["-a"] if args.has_key("-a") else None
    
     
    if (args is not None): 
        check(n, p, a);
    else:
        raise ValueError("Invalid Command Line: Unable to parse the CommandLine arguments")
    
    debugArgument(n, p, a)    
    
    v = list()

    for i in range(n):
        startProcess(v, p, a)
    
    time.sleep(n)
    
    # ask the user to input and ignore the input
    # there is an error to switch to use 
    #   input("Please enter any key to continue:")
    # but rather when you change to use 
    #   raw_input(Please enter any key to continue:")
    # then the problem goes away, 
    # need to find out the reason why
    # 
    raw_input("Please enter any key to continue:")
    
   
    
    for child in v:
        child.write("\n")
        # child.flush()
        child.close()
            
    print "Done!"


# see 
#   http://docs.python.org/library/multiprocessing.html
# this is a abstract layer over the Unix and Windows to do multiprocessing
# while you can use 
#   * queue
#   * pipe
# to communicate 
# 
#def startProcess(p, a):
#    parent_conn, child_conn = multiprocessing.Pipe()
#    p = multiprocessing.Process(target=childProcess, args=(child_conn,))
#    p.start()
#    print parent_conn.recv()
#    p.join()
#    
#def childProcess(conn):
#    conn.send([42, None, 'hello'])
#    conn.close()
    


def startProcess(v, p, a):
    """
    :param v: list of stdin PIPE to child 
    :param p: the child command's path
    :param a: the child command's argument
    :raise:
    :return: None
    :remark: `start_command | {child}`; the child read from PIPE and 
             and its stdin handler is stored in the list `v`;
             More details, please read 
                http://docs.python.org/library/subprocess.html#module-subprocess
             in section "17.1.4.2. Replacing shell pipeline"
    """
    commandline = [p]
    if (a is not None and a != ""):
        commandline.append(a)
    v.append(subprocess.Popen(commandline, shell=True, stdin=subprocess.PIPE).stdin)

if __name__ == '__main__':
    main()
 

 

 

分享到:
评论

相关推荐

    The Python 3 Standard Library by Example.pdf

    1. **内置模块**:Python 3的标准库包括了诸如`sys`、`os`和`io`这样的内置模块。`sys`模块提供了与Python解释器交互的接口,如获取命令行参数、退出程序等;`os`模块则提供了操作系统相关的功能,如文件和目录操作...

    The-Python-3-Standard-Library-by-Example.rar

    《The Python 3 Standard Library by Example》这本书深入浅出地介绍了这些丰富的资源,帮助开发者充分利用 Python 的强大功能。 首先,让我们来看看 Python 3 标准库中的基础部分。包括数据结构如列表(list)、...

    The.Python.Standard.Library.by.Example.2011.RETAiL.eBOOk

    《Python Standard Library by Example》是2011年发布的一本零售电子书,专注于介绍Python标准库的使用。这本书通过实例的方式,详细讲解了Python编程中标准库的各种功能和应用,帮助开发者深入理解和掌握Python的...

    通过python实现转换ncm格式音乐文件格式为mp3

    1. **安装依赖**:在开始之前,确保已经安装了Python环境。然后使用pip来安装这两个库: ``` pip install pyncm ``` `ffmpeg`可能需要手动下载并添加到系统路径,因为不是所有Python包管理器都能直接安装。 2. ...

    The Python 3 Standard Library by Example-new

    这本书《Python 3 Standard Library by Example》旨在通过实例来详细介绍这些库的使用方法,帮助开发者更好地理解和利用Python的强大功能。 1. **模块介绍**:Python 3标准库中的模块包括os、sys、math、datetime、...

    基于python的monkey自动化脚本

    1. **Python与ADB**:Android Debug Bridge (ADB) 是Android设备和计算机之间的桥梁,允许开发者进行设备管理、数据传输和调试。Python可以通过`subprocess`模块调用ADB命令,例如启动、停止应用,发送Monkey事件等...

    python3.6.5参考手册 chm

    Python参考手册,官方正式版参考手册,chm版。以下摘取部分内容:Navigation index modules | next | Python » 3.6.5 Documentation » Python Documentation contents What’s New in Python What’s New In ...

    Python-自动卸载手机或模拟器中App的Python脚本

    2. `requirements.txt`:列出脚本运行所需的Python库,如`subprocess`用于执行系统命令,或者`argparse`处理命令行参数。 3. `README.md`:详细说明脚本的使用方法、依赖及注意事项。 4. `example.txt`:可能是一个...

    python解压rar文件.zip

    file1 = "example.doc" file2 = "exmpl.docx" print(match_filenames(file1, file2, 0.8)) # 如果相似度大于等于0.8,则返回True ``` 通过调整阈值,我们可以控制文件名匹配的严格程度。 总的来说,这个过程涉及了...

    python学习资料python脚本实现监控apache

    Python提供了一些强大的库,如psutil和subprocess,可以用来获取系统信息,包括与Apache相关的数据。psutil库允许我们获取系统的CPU使用率、内存使用情况、网络活动等信息,而subprocess则可以用来执行shell命令,...

    download-and-install-deb--with-python.tar.gz

    urls = ['http://example.com/file1.deb', 'http://example.com/file2.deb'] for url in urls: filename = url.split('/')[-1] urllib.request.urlretrieve(url, filename) ``` 接下来,要安装`.deb`文件,通常...

    Stack-Overflow-About-Python-中文1

    filename = "example.txt" if os.path.exists(filename): print("File exists.") else: print("File does not exist.") ``` 【在Python中有三元运算符吗?】 Python 没有真正的三元运算符,但可以通过条件表达式...

    Python-sh一个Python进程启动

    通过`sh`,你可以避免使用复杂的os、subprocess等标准库,简化命令行操作,提高代码可读性和易维护性。 1. **安装与导入**:首先,你需要通过pip来安装`sh`库,命令如下: ``` pip install sh ``` 安装完成后,...

    Python技法:实用运维脚本编写(进程-文件-目录操作).doc

    res = subprocess.run(["Python-Lang/cal.out", "1", "2"]) print(res.returncode) ``` 当需要处理异常情况,比如子进程长时间未结束,我们可以设置超时机制,并捕获 `subprocess.TimeoutExpired` 异常: ```...

    Python指挥打印机批量打印文件.zip

    这个教程可能包括一个Jupyter Notebook(Python交互式编程环境)的文件"Python指挥打印机批量打印文件(实例54).ipynb",一个纯Python源代码文件"example54.py",以及可能用于辅助解释的图片或示例文件所在的"images...

    Python代码源码-实操案例-框架案例-如何调用系统默认程序打开相应文件.zip

    首先,Python提供了`os`和`subprocess`两个内置模块,它们可以用来与操作系统进行交互。在处理打开文件的问题时,`os.startfile()`函数和`subprocess.Popen()`方法是常用的选择。 1. `os.startfile()`: 这个函数是`...

    Python怎么调用系统命令.docx

    以上介绍了几种在Python中调用系统命令的方法,包括`os.system()`、`wx.Execute()`、`subprocess`模块、`webbrowser.open()`以及`os.popen()`。每种方法都有其适用场景和特点。在实际应用中,可以根据具体需求选择最...

    svn-python-1.5.2.win32-py2.5.zip

    然而,需要注意的是,随着Python 2.5的过时,这个版本的库可能不再得到维护和支持,因此在现代项目中,可能需要寻找更新的版本或替代方案,比如`libsvn`或使用Python 3兼容的`subprocess`模块来调用SVN命令行工具。

Global site tag (gtag.js) - Google Analytics