使用os.system(“cmd”)
调用shell脚本后,该方法返回一个16位的二进制数,低位是杀死被调用脚本的信号号,高位是脚本的退出状态码,即在"的代码之后脚本中的 exit 1" 被执行,os.系统函数返回值的高位为1,如果低位为0,则函数的返回值为0×100,转换为十进制得到256。
如果我们需要得到 os.system 的正确返回值,我们可以使用 shift 操作恢复返回值:
>>> n = os.system(test.sh)
>>> n >> 8
>>> 3
这是最简单的方法,其特点是程序在执行时会打印出cmd在linux上执行的信息。使用前需要导入os。
os.system("ls") 只在子终端运行系统命令,无法获取命令执行后的返回信息。
os.Popen
这个调用方法是通过管道实现的,函数返回一个类文件对象,其内容就是脚本输出的内容(可以简单理解为echo输出的内容)。使用os.popen调用test.sh的案例:python调用shell脚本,有两种方法:os.system(cmd)或者os.popen(cmd),前者的返回值是退出状态码脚本,后者的返回值是脚本执行过程中的输出。在实际使用中,根据需要进行选择。显然,调用“ls”之类的shell命令应该使用popen的方法来获取内容。
popen(command [, mode='r' [, bufsize]]) -> pipe
tmp = os.popen('ls *.py').readlines()
subprocess.Popen
现在大多数人都喜欢使用 Popen。 Popen 方法不会打印出 cmd 在 linux 上执行的信息。确实,Popen 非常强大,支持很多参数和模式。 from subprocess import Popen,使用前需要PIPE。但是Popen函数有个缺陷,就是它是一种阻塞方法。如果运行cmd时产生大量内容,该功能很容易被阻塞。解决方法是不使用wait()方法,但是不能得到执行的返回值。
Popen原型是:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None,
close_fds=False, shell=false)
参数bufsize:指定缓冲。
参数executable用于指定可执行程序。一般来说,我们通过args参数设置程序运行。如果参数 shell 设置为 True,executable 将指定程序使用的 shell。在 Windows 平台上,默认 shell 由 COMSPEC 环境变量指定。
参数 stdin、stdout 和 stderr 分别代表程序的标准输入、输出和错误句柄。它们可以是 PIPE、文件描述符或文件对象,也可以设置为 None 以指示从父进程继承。
参数preexec_fn只在Unix平台下有效,用来指定一个可执行对象(callable object),在子进程运行前会被调用。
参数Close_sfs:在Windows平台下,如果close_fds设置为True,则新创建的子进程将不会继承父进程的输入、输出和错误管道。我们不能将 close_fds 设置为 True 并同时重定向子进程的标准输入、输出和错误(stdin、stdout、stderr)。
如果参数shell设为true,程序将通过shell来执行。
参数cwd用于设置子进程的当前目录。
参数env是字典类型,用于指定子进程的环境变量。如果 env = None,则子进程的环境变量将从父进程继承。
参数Universal_newlines:在不同的操作系统下,文本的换行是不同的。例如,在 Windows 下,使用“/r/n”表示更改,在 Linux 下使用“/n”。如果此参数设置为 True,Python 会将这些换行符统一视为 '/n'。
参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。
subprocess.PIPE
在创建 Popen 对象时,subprocess.PIPE 可以初始化 stdin、stdout 或 stderr 参数,代表与子进程通信的标准流。
subprocess.STDOUT
创建Popen对象时,用于初始化stderr参数,表示错误会通过标准输出流输出。
Popen的方法:
Popen.poll()
用于检查子进程是否已经结束。设置并返回 returncode 属性。
Popen.wait()
等待子进程结束。设置并返回returncode属性。
Popen.communicate(input=None)
与子进程交互。向标准输入发送数据,或从标准输出和标准错误读取数据。可选参数输入指定要发送到子进程的参数。 Communicate() 返回一个元组:(stdoutdata, stderrdata)。注意:如果要通过其stdin向进程发送数据,在创建Popen对象时,参数stdin必须设置为PIPE。同样,如果要从 stdout 和 stderr 获取数据,则必须将 stdout 和 stderr 设置为 PIPE。
Popen.send_signal(signal)
向子进程发送信号。
Popen.terminate()
停止(stop)子进程。在Windows平台下,该方法会调用Windows API TerminateProcess()来终止子进程。
Popen.kill()
杀死子进程。
Popen.stdin
如果在创建 Popen 对象时将参数 stdin 设置为 PIPE,Popen.stdin 将返回一个文件对象,供子进程发送命令。否则返回无。
Popen.stdout
如果创建Popen对象时参数stdout设置为PIPE,Popen.stdout会返回一个文件对象供子进程发送命令。否则返回无。
Popen.stderr
如果创建Popen对象时参数stdout设置为PIPE,Popen.stdout会返回一个文件对象供子进程发送命令。否则返回无。
Popen.pid
获取子进程的进程ID。
Popen.returncode
获取进程的返回值。如果进程还没有结束,返回None。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python标签有什么作用?09/15
- ♥ demo:平面战争游戏python小项目11/19
- ♥ Python中的复数函数是什么?08/14
- ♥ 如何在python中调用类方法09/24
- ♥ python如何显示图像?09/22
- ♥ 如何在python中随机选择n个不同的数字09/17
内容反馈