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

Python 专栏收录该内容
42 篇文章 2 订阅

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

Python3 学习笔记(目录)

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

1. os.system()

函数原型:

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

代码示例:

>>> import os
>>> 
>>> result = os.system("python3 -V")
Python 3.7.3
>>> result
0
>>> os.system("python3 -V")
Python 3.7.3
0

2. os.popen()

函数原型:

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

2.1 读取对象 代码示例:

文件: demo.py

print("hello world")

执行命令:

>>> import os
>>> 
>>> fr = os.popen("python3 demo.py")
>>> fr.read()
'hello world\n'
>>> fr.close()

2.2 写入对象 代码示例:

文件: demo.py

print("hello")
s = input()
print(s)
print("world")

文件: app.py

import os

fw = os.popen("python3 demo.py", mode="w")
fw.write("你好")
fw.close()

执行命令:

$ python3 app.py
hello
你好
world

3. 子进程管理: subprocess

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

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

3.1 subprocess.run()

Python Docs: subprocess.run()

函数原型:

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

代码示例:

>>> import subprocess
>>> 
>>> r = subprocess.run("ls")
aa_dir          aa.jpg          aa.txt
>>> r.returncode
0
>>> subprocess.run(["ls", "-l"])
total 720
drwxr-xr-x  3 xiets  staff     96 Oct 11  2019 aa_dir
-rw-r--r--@ 1 xiets  staff  82182 Sep 18 09:56 aa.jpg
-rw-r--r--  1 xiets  staff  64441 Sep 28 11:29 aa.txt
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> 
>>> subprocess.run(["python3", "-m", "pip", "list"])
Package    Version
---------- ---------
pip        20.2.2
setuptools 41.2.0
CompletedProcess(args=['python3', '-m', 'pip', 'list'], returncode=0)
>>>
>>> subprocess.run("pwd", cwd="/Users")
/Users
CompletedProcess(args='pwd', returncode=0)

3.2 subprocess.Popen

Python Docs:

subprocess.Popen类构造方法:

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=None, 
                       startupinfo=None, creationflags=0, restore_signals=True,
                       start_new_session=False, pass_fds=(), *, 
                       encoding=None, errors=None, text=None)
# 部分参数说明:
#
# args: 
#    需要执行的命令, str 或 list/tuple 类型, 如果携带参数需要使用 list/tuple 类型, 
#    将命令以及每个参数组成 list/tuple, 例如: ["python3", "-m", "pip", "list"]
#
# stdin, stdout, stderr:
#    子进程的标准 输入、输出、错误输出
#
# cwd:
#    执行命令时的工作目录
#
# timeout:
#    超时时间, 超过该时间子进程还没有结束, 则杀掉子进程并抛出异常
#
# env:
#    为子进程设置环境变量, 字典类型, 默认继承自父进程

subprocess.Popen实例的方法:

# 检查子进程是否已被终止, 如果终止则返回 returncode, 否则返回 None
Popen.poll()

# 等待子进程被终止, 并返回 returncode, 可以指定等待时间, 超过则抛出异常
Popen.wait(timeout=None)

# 杀死子进程, 发送 SIGKILL 信号到子进程
Popen.kill()

# 发送 signal 信号到子进程
Popen.send_signal(signal)

# 与进程交互: 将数据发送到 stdin。从 stdout 和 stderr 读取数据, 直到到达文件末尾。
# 等待进程终止并设置 returncode 属性。
# 可选输入参数应该是要发送到子进程的数据, 如果没有数据要发送到子进程, 则为 None。
# 如果以文本模式打开流,则输入必须为字符串。否则,它必须是字节。
# 返回一个 (stdout_data, stderr_data) 元组。如果文件以文本模式打开则为字符串, 否则为字节。
Popen.communicate(input=None, timeout=None)

# 停止子进程。在 POSIX 操作系统上, 该方法将 SIGTERM 发送给子进程。
# 在Windows上, 将调用 Win32 API 函数 TerminateProcess()来停止子进程。
Popen.terminate()


# 传递给 Popen 的命令参数序列或字符串
Popen.args

# 子进程的标准输入
Popen.stdin

# 子进程的标准输出
Popen.stdout

# 子进程的错误输出
Popen.stderr

# 子进程的进程ID
Popen.pid

# 子进程的退出码, 由 poll() 和 wait() 设置(以及直接由 communicate() 设置)。
# None 表示子进程还没有结束。
Popen.returncode

代码示例:

import subprocess

p = subprocess.Popen(["java", "-version"])
p.wait()
print(p.returncode)
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值