专栏首页生信修炼手册python执行系统命令

python执行系统命令

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

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

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

>>> 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·

本文分享自微信公众号 - 生信修炼手册(shengxinxiulian),作者:lzyg

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TMB:肿瘤突变负荷简介

    肿瘤的免疫疗法是即手术,放疗,化疗等传统治疗手段之后兴起的一种新型的治疗手段,以PD-1/PD-L1抗体为代表的免疫检查点抑制剂在黑色素瘤,非小细胞肺癌等实体瘤...

    生信修炼手册
  • Euk-mPLOC:预测真核生物蛋白的亚细胞定位

    对于蛋白质功能研究而言,亚细胞定位是非常重要的分析内容。蛋白质在细胞中是流动的,所以一个蛋白可以具有一个到多个的亚细胞定位信息。比如转录因子等蛋白,其亚细胞定位...

    生信修炼手册
  • 使用circRNA_finder识别环状RNA

    circRNA_finder是一款环状RNA预测软件,在对果蝇的研究中采用该软件进行了环状RNA的预测,该软件的源代码托管在github上,网址如下

    生信修炼手册
  • python之系统命令

    以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。

    菲宇
  • python中执行shell命令的几个方

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 代码如下:

    py3study
  • python打开外部应用

    stdin.close()    —> 写入之后必须关闭或flush 才可以读取到数据

    py3study
  • python subprocess模块

    py3study
  • Python模块之subprocess用法实例详解

    subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。

    菲宇
  • React多页面应用5(webpack生产环境配置,包括压缩js代码,图片转码等)

    本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包...

    前端人人
  • webpack 插件机制分析及开发调试

    webpack 插件机制是整个 webpack 工具的骨架,而 webpack 本身也是利用这套插件机制构建出来的。

    winty

扫码关注云+社区

领取腾讯云代金券