当前位置 : 主页 > 编程语言 > python >

python执行系统命令

来源:互联网 收集:自由互联 发布时间:2022-06-24
欢迎关注”生信修炼手册”! 在实际开发中,除了编写python自身的代码外,还经常需要执行操作系统的命令。在python3中,推荐使用subprocess模块来执行系统命令,基本用法如下 # 导入模块

欢迎关注”生信修炼手册”!

在实际开发中,除了编写python自身的代码外,还经常需要执行操作系统的命令。在python3中,推荐使用subprocess模块来执行系统命令,基本用法如下

# 导入模块
>>> import subprocess
# 执行系统命令 wc-l
>>> cmd = subprocess.run(['ls','-l'])
# 运行状态,运行成功返回0
>>> cmd.returncode
0

上述代码中通过一个列表来记录执行的命令,软件名称,选项,参数等都对应列表中的一个元素。直接将软件的设置一个个分隔成列表元素是比较繁琐的,推荐下列写法

>>> import shlex, subprocess
>>> command_line = 'ls -l'
>>> args = shlex.split(command_line)
>>> subprocess.run(args)

通过shlex模块的split功能,可以将字符串分隔成合适的参数列表。当然你也可以直接使用字符串参数,用法如下


>>> cmd = subprocess.run('ls -l', shell = True)


注意,必须设置shell参数的值为True才可以支持字符串写法,否则程序会认为第一个参数是一个文件路径,找不到该路径,然后报错

>>> cmd = subprocess.run('ls -l')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/subprocess.py", line 693, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'ls -l'

shell参数的真正作用是交给系统的shell脚本来执行命令,比如复杂的linux命令


>>> subprocess.run('cat config.txt | grep "samples" | cut -f1 > a.txt', shell = True)

除了单纯执行系统命令外,有时

>>> cmd = subprocess.run('ls -l', shell = True, capture_output=True)
>>> cmd.stdout.decode('utf8')

设置capture_output参数的值为True, 在返回对象中会包含stdout属性,默认以字节形式返回执行的结果,只需要用decode解码,即可转换为字符串。

另外,还支持限定执行时间,如果超时,则报错,写法如下


>>> cmd = subprocess.run('ls -l', shell = True, timeout = 100)


time参数的单位为秒, 对于联网下载数据等操作,设置超时时间,可以避免因为网络原因引起的阻塞。

以上这些都是基本用法,在subprocess模块中,还提供了Popen方法,提供了更加灵活强大的功能,可以控制系统命令的输入输出,通过管道连接多个命令。控制标准输入的经典使用场景是运行交互式的命令,用法如下

>>> import subprocess
# stdin 控制标准输入流
# stdout 控制标准输出流
>>> s = subprocess.Popen("python", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
# 向标准输入流写入参数
>>> s.stdin.write(b"print('hello')")
14
>>> s.stdin.close()
# 从标准输出流读出运行结果
>>> out = s.stdout.read().decode("utf8")
>>> s.stdout.close()
>>> out
'hello\n'

还有一种用法是捕获程序的标准输出和标准错误流,用法如下

>>> p = subprocess.Popen(['ls', '-l'], stdout = subprocess.PIPE)
>>> outs, errors = p.communicate()

outs存储的是程序的输出结果,error存储的是程序的报错信息。又时我们希望不显示程序的输出和报错信息,此时可以将标准输出和标准错误流重定向到/dev/null,写法如下


>>> subprocess.Popen(['ls', '-l'], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL)

更多用法请查看subprocess模块的API文档。

·end·

—如果喜欢,快分享给你的朋友们吧—



关注我们,解锁更多精彩内容!


python执行系统命令_python



上一篇:python读写ini格式的配置文件
下一篇:没有了
网友评论