远程执行shell命令:os.system(),os.popen,subprocess.popen

1.os.system(cmd)

阻塞

参数:

os.system('ls')

os.system(f'ls {dir}')

该函数返回命令执行结果的返回值,system()函数在执行过程中进行了以下三步操作:
1.fork一个子进程;
2.在子进程中调用exec函数去执行命令;
3.在父进程中调用wait(阻塞)去等待子进程结束。
对于fork失败,system()函数返回-1。
由于使用该函数经常会莫名其妙地出现错误,但是直接执行命令并没有问题,所以一般建议不要使用。

这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息。使用前需要import os。

os.system("ls")  仅仅在一个子终端运行系统命令, 而不能获取命令执行后的返回信息

2.os.popen(cmd, mode, bufsize)

非阻塞

  • mode -- 模式权限可以是 'r'(默认) 或 'w'。

  • bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。

返回命令执行结果

3.subprocess.popen()

非阻塞

Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。

构造函数:

class subprocess.Popen(args,
                    bufsize=-1,
                    executable=None,
                    stdin=None,
                    stdout=None,
                    stderr=None,
                    preexec_fn=None,
                    close_fds=True,
                    shell=False,
                    cwd=None,
                    env=None,
                    universal_newlines=False,
                    startupinfo=None,
                    creationflags=0,
                    restore_signals=True,
                    start_new_session=False,
                    pass_fds=(),
                    *,
                    encoding=None,
                    errors=None)

常用参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
      0:不使用缓冲区
      1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
      正数:表示缓冲区大小
      负数:表示使用系统默认的缓冲区大小。
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
    • cwd:用于设置子进程的当前目录。
    • env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。

参数既可以是string也可以是list:

subprocess.Popen([“cat”,”test.txt”])
subprocess.Popen(“cat test.txt”, shell=True)
对于参数是字符串,需要指定shell=True

 

3)使用示例
其中subprocess.call用于代替os.system,示例:

import subprocess
returnCode = subprocess.call('adb devices')
print returnCode

 

 
posted @ 2022-06-22 17:16  小柴i  阅读(502)  评论(0编辑  收藏  举报