1. sys.argv
· 应用场景:
当我们在控制台使用python解释器运行python程序时,我们需要用户在控制台给程序传递数据。sys.argv属性返回的是控制台参数列表,列表的第一个值是运行文件的相对路径(相对于当前工作目录),其余的值是用户指定的参数。
· 举例说明:
例如py文件是:
#mytest.py
def func(a, b):
print(a+b)
func(int(sys.argv[1]), int(sys.argv[2]))
控制台输入是:python mytest.py 45 32
那么控制台便会得到77的结果,原因是当在控制台输入45,32后,sys.argv[1]捕获到45,sys.argv[2]捕获到32,那么程序就可以继续进行下去直到计算出和并打印出来。
2. subprocess
· 应用场景:希望在python程序中执行一些外部命令例如:控制台命令。
注意subprocess和multiprocessing的异同:
它们的相同点是都是开新的进程。
不同点是:
1.subprocess它是专门开新进程来执行外部可执行程序的,它是os.fork() 和 os.execve() 的高级封装,比如这里可以用它来执行[ping www.baidu.com]控制台命令。
2.multiprocessing它是开新进程来执行python程序的,比如执行一个python函数等。另外multiprocessing还集成了像Queue、Pipes等方式来实现进程间的通信。
· 简单示例:直接在py文件中使用subprocess.call(cmd, shell=True)语句,通过在当前进程下创建子进程去执行cmd这个外部命令。当然也可以使用subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT)来创建一个子进程实例去执行外部命令。接下来说一下这两者的区别:
1.subprocess.call()
import subprocess
status_code = subprocess.call(arg, shell=True) # 子进程
'''
在当前进程下(正在执行的python程序称为父进程)通过创建子进程来执行外部命令。
特点是:当执行到该语句时,父进程会被挂起等待该子进程执行结束后再执行后面的语句。
这跟顺序执行的逻辑是一样的,所以我们推荐使用这个方法。
'''
arg:str or list,要执行的外部命令。例如'ping www.baidu.com'或['ping','www.baidu.com']
shell:是否调用shell来执行外部命令,默认是False
返回值:外部命令执行状态码,0表示ok。
2.subprocess.Popen()
import subprocess
child = subprocess.Popen(arg, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT) # 子进程。PIPE,STDOUT用大写表示它们是常量。
child.wait()
print('判断顺序的打印信息')
'''
用父进程(P)创建(open)一个子进程实例来执行外部命令(这是调的类创建实例所以返回的是子进程实例不像call函数返回的是个int)
特点:父进程并不会等待子进程的介绍。也就是说现在子进程和父进程会并行。如果你不想它们并行,
希望按顺序执行的话可以调用child.wait()来让父进程等待。
'''
arg:str or list,要执行的外部命令。例如'ping www.baidu.com'或['ping','www.baidu.com']
shell:是否调用shell来执行外部命令,默认是False
返回值:创建的子进程对象
这两个方法还有其他的参数可以参考:https://docs.python.org/3/library/subprocess.html