社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python执行系统命令

生信修炼手册 • 4 年前 • 443 次点击  
欢迎关注”生信修炼手册”!
在实际开发中,除了编写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 "", line 1, in   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/Django开发社区
本文地址:http://www.python88.com/topic/62930
 
443 次点击