Python3: Shell 命令调用、执行 Shell 脚本

蔚落 2021-09-21 23:04 1412阅读 0赞

本文链接: https://blog.csdn.net/xietansheng/article/details/115559070

Python3 学习笔记(目录)

Python Shell 操作相关函数和类, Python Docs:

  • os.system(command)
  • os.popen(cmd, mode=‘r’, buffering=-1)
  • subprocess — Subprocess management

1. os.system()

函数原型:

  1. # 在子 shell 中执行命令(字符串)。该函数是调用标准 C 函数 system() 来实现的,
  2. # 因此限制条件与该函数相同。对 sys.stdin 等的更改不会反映在执行命令的环境中。
  3. # command 产生的任何输出将被发送到解释器标准输出流。
  4. # 返回一个 int 类型的 code,一般返回 0 表示执行成功。
  5. os.system(command)

代码示例:

  1. >>> import os
  2. >>>
  3. >>> result = os.system("python3 -V")
  4. Python 3.7.3
  5. >>> result
  6. 0
  7. >>> os.system("python3 -V")
  8. Python 3.7.3
  9. 0

2. os.popen()

函数原型:

  1. # 打开一个管道执行 cmd 命令, 返回值是连接到管道的 文件对象。
  2. # 只能和管道单向通讯, 返回值只能是 写入 或 读取 对象。
  3. # mode 为 'r', 表示返回的的是 读取对象, 可以对管道 read()、 readlines()
  4. # mode 为 'w', 表示返回的的是 写入对象, 可以对管道 write()、writelines()
  5. # 返回的文件对象只能读写字符串, 不能是字节类型。
  6. os.popen(cmd, mode='r', buffering=-1)

2.1 读取对象 代码示例:

文件: demo.py

  1. print("hello world")

执行命令:

  1. >>> import os
  2. >>>
  3. >>> fr = os.popen("python3 demo.py")
  4. >>> fr.read()
  5. 'hello world\n'
  6. >>> fr.close()

2.2 写入对象 代码示例:

文件: demo.py

  1. print("hello")
  2. s = input()
  3. print(s)
  4. print("world")

文件: app.py

  1. import os
  2. fw = os.popen("python3 demo.py", mode="w")
  3. fw.write("你好")
  4. fw.close()

执行命令:

  1. $ python3 app.py
  2. hello
  3. 你好
  4. world

3. 子进程管理: subprocess

subprocess模块允许你创建新的子进程,可以连接子进程输入、输出、错误 管道,并获取子进程的返回码。

Python 推荐使用subprocess.run()函数掉用子进程,更高级的用法也可以使用底层的class subprocess.Popen接口。

3.1 subprocess.run()

Python Docs: subprocess.run()

函数原型:

  1. subprocess.run(args,
  2. *,
  3. stdin=None, input=None, stdout=None, stderr=None,
  4. capture_output=False, shell=False, cwd=None, timeout=None,
  5. check=False, encoding=None, errors=None, text=None, env=None,
  6. universal_newlines=None, **other_popen_kwargs)
  7. # 部分参数说明:
  8. #
  9. # args:
  10. # 需要执行的命令, str 或 list/tuple 类型, 如果携带参数需要使用 list/tuple 类型,
  11. # 将命令以及每个参数组成 list/tuple, 例如: ["python3", "-m", "pip", "list"]
  12. #
  13. # stdin, stdout, stderr:
  14. # 子进程的标准 输入、输出、错误输出
  15. #
  16. # cwd:
  17. # 执行命令时的工作目录
  18. #
  19. # timeout:
  20. # 超时时间, 超过该时间子进程还没有结束, 则杀掉子进程并抛出异常
  21. #
  22. # env:
  23. # 为子进程设置环境变量, 字典类型, 默认继承自父进程
  24. #
  25. # 等待命令执行完成后, 返回一个 subprocess.CompletedProcess 实例,
  26. # 可以通过 CompletedProcess.returncode 属性判断子进程的返回 Code。

代码示例:

  1. >>> import subprocess
  2. >>>
  3. >>> r = subprocess.run("ls")
  4. aa_dir aa.jpg aa.txt
  5. >>> r.returncode
  6. 0
  7. >>> subprocess.run(["ls", "-l"])
  8. total 720
  9. drwxr-xr-x 3 xiets staff 96 Oct 11 2019 aa_dir
  10. -rw-r--r--@ 1 xiets staff 82182 Sep 18 09:56 aa.jpg
  11. -rw-r--r-- 1 xiets staff 64441 Sep 28 11:29 aa.txt
  12. CompletedProcess(args=['ls', '-l'], returncode=0)
  13. >>>
  14. >>> subprocess.run(["python3", "-m", "pip", "list"])
  15. Package Version
  16. ---------- ---------
  17. pip 20.2.2
  18. setuptools 41.2.0
  19. CompletedProcess(args=['python3', '-m', 'pip', 'list'], returncode=0)
  20. >>>
  21. >>> subprocess.run("pwd", cwd="/Users")
  22. /Users
  23. CompletedProcess(args='pwd', returncode=0)

3.2 subprocess.Popen

Python Docs:

  • 构造方法: class subprocess.Popen
  • 实例方法: popen-objects

subprocess.Popen类构造方法:

  1. class subprocess.Popen(args, bufsize=-1, executable=None,
  2. stdin=None, stdout=None, stderr=None,
  3. preexec_fn=None, close_fds=True, shell=False,
  4. cwd=None, env=None, universal_newlines=None,
  5. startupinfo=None, creationflags=0, restore_signals=True,
  6. start_new_session=False, pass_fds=(), *,
  7. encoding=None, errors=None, text=None)
  8. # 部分参数说明:
  9. #
  10. # args:
  11. # 需要执行的命令, str 或 list/tuple 类型, 如果携带参数需要使用 list/tuple 类型,
  12. # 将命令以及每个参数组成 list/tuple, 例如: ["python3", "-m", "pip", "list"]
  13. #
  14. # stdin, stdout, stderr:
  15. # 子进程的标准 输入、输出、错误输出
  16. #
  17. # cwd:
  18. # 执行命令时的工作目录
  19. #
  20. # timeout:
  21. # 超时时间, 超过该时间子进程还没有结束, 则杀掉子进程并抛出异常
  22. #
  23. # env:
  24. # 为子进程设置环境变量, 字典类型, 默认继承自父进程

subprocess.Popen实例的方法:

  1. # 检查子进程是否已被终止, 如果终止则返回 returncode, 否则返回 None
  2. Popen.poll()
  3. # 等待子进程被终止, 并返回 returncode, 可以指定等待时间, 超过则抛出异常
  4. Popen.wait(timeout=None)
  5. # 杀死子进程, 发送 SIGKILL 信号到子进程
  6. Popen.kill()
  7. # 发送 signal 信号到子进程
  8. Popen.send_signal(signal)
  9. # 与进程交互: 将数据发送到 stdin。从 stdout 和 stderr 读取数据, 直到到达文件末尾。
  10. # 等待进程终止并设置 returncode 属性。
  11. # 可选输入参数应该是要发送到子进程的数据, 如果没有数据要发送到子进程, 则为 None。
  12. # 如果以文本模式打开流,则输入必须为字符串。否则,它必须是字节。
  13. # 返回一个 (stdout_data, stderr_data) 元组。如果文件以文本模式打开则为字符串, 否则为字节。
  14. Popen.communicate(input=None, timeout=None)
  15. # 停止子进程。在 POSIX 操作系统上, 该方法将 SIGTERM 发送给子进程。
  16. # 在Windows上, 将调用 Win32 API 函数 TerminateProcess()来停止子进程。
  17. Popen.terminate()
  18. # 传递给 Popen 的命令参数序列或字符串
  19. Popen.args
  20. # 子进程的标准输入
  21. Popen.stdin
  22. # 子进程的标准输出
  23. Popen.stdout
  24. # 子进程的错误输出
  25. Popen.stderr
  26. # 子进程的进程ID
  27. Popen.pid
  28. # 子进程的退出码, 由 poll() 和 wait() 设置(以及直接由 communicate() 设置)。
  29. # None 表示子进程还没有结束。
  30. Popen.returncode

代码示例:

  1. import subprocess
  2. p = subprocess.Popen(["java", "-version"])
  3. p.wait()
  4. print(p.returncode)

发表评论

表情:
评论列表 (有 0 条评论,1412人围观)

还没有评论,来说两句吧...

相关阅读