Python执行Linux系统命令的4种方法

1.os.system
    仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息
在Ubuntu系统的输出为:
在这里插入图片描述

>>> import os
>>> os.system("ls")
LICENSE                                create_splits_LSCC_CM_tumor.py  datasets                       eval_mtl_concat_result.txt     main_mtl_concat_result.txt     splits_LSCC_CCRCC            test.py
LSCC_CM                                create_splits_copy.py           docs                           eval_results                   main_mtl_concat_tumor_copy.py  splits_LSCC_CCRCC_tumor      utils
create_splits.py                       create_splits_help              eval_mtl_concat_LSCC_CCRCC.py  main_mtl_concat_LSCC_CCRCC.py  models                         splits_LSCC_CM
create_splits_LSCC_CCRCC.py            create_splits_result.txt        eval_mtl_concat_LSCC_CM.py     main_mtl_concat_LSCC_CM.py     results                        splits_LSCC_CM_Augmentation
create_splits_LSCC_CM.py               data_preprocess                 eval_mtl_concat_copy.py        main_mtl_concat_copy.py        results_LSCC_CCRCC             splits_LSCC_CM_tumor
create_splits_LSCC_CM_augmentation.py  dataset_csv                     eval_mtl_concat_help           main_mtl_concat_help           splits                         splits_copy
0

2.os.popen
    该方法不但执行命令还返回执行后的信息对象。

>>> import os
>>> tmp=os.popen("ls *.py").readlines()
>>> tmp
['create_splits.py\n', 'create_splits_LSCC_CCRCC.py\n', 'create_splits_LSCC_CM.py\n', 'create_splits_LSCC_CM_augmentation.py\n', 'create_splits_LSCC_CM_tumor.py\n', 'create_splits_copy.py\n', 'eval_mtl_concat_LSCC_CCRCC.py\n', 'eval_mtl_concat_LSCC_CM.py\n', 'eval_mtl_concat_copy.py\n', 'main_mtl_concat_LSCC_CCRCC.py\n', 'main_mtl_concat_LSCC_CM.py\n', 'main_mtl_concat_copy.py\n', 'main_mtl_concat_tumor_copy.py\n', 'test.py\n']
>>> tmp=os.popen("ls *.py")
>>> tmp
<open file 'ls *.py', mode 'r' at 0x7f669a1545d0>

注:
popen()方法语法格式如下:os.popen(command[, mode[, bufsize]])
参数

  • command – 使用的命令。
  • mode – 模式权限可以是 ‘r’(默认) 或 ‘w’。
  • bufsize – 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。

返回值
返回一个文件描述符号为fd的打开的文件对象
3.使用模块 subprocess

>>> import subprocess
>>> p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> p
<subprocess.Popen object at 0x7f669a112410>
>>> for line in p.stdout.readlines():
...     print line,
...
LICENSE
LSCC_CM
create_splits.py
create_splits_LSCC_CCRCC.py
create_splits_LSCC_CM.py
create_splits_LSCC_CM_augmentation.py
create_splits_LSCC_CM_tumor.py
create_splits_copy.py
create_splits_help
create_splits_result.txt
data_preprocess
dataset_csv
datasets
docs
eval_mtl_concat_LSCC_CCRCC.py
eval_mtl_concat_LSCC_CM.py
eval_mtl_concat_copy.py
eval_mtl_concat_help
eval_mtl_concat_result.txt
eval_results
main_mtl_concat_LSCC_CCRCC.py
main_mtl_concat_LSCC_CM.py
main_mtl_concat_copy.py
main_mtl_concat_help
main_mtl_concat_result.txt
main_mtl_concat_tumor_copy.py
models
results
results_LSCC_CCRCC
splits
splits_LSCC_CCRCC
splits_LSCC_CCRCC_tumor
splits_LSCC_CM
splits_LSCC_CM_Augmentation
splits_LSCC_CM_tumor
splits_copy
test.py
utils
>>> retval = p.wait()

注:subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。

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)
参数:

  • args:表示要执行的命令。必须是一个字符串,字符串参数列表。
  • stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
  • timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired 异常。
  • check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。
  • encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
  • shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。

4.使用模块 commands

>>> import commands
>>> dir(commands)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'getoutput', 'getstatus', 'getstatusoutput', 'mk2arg', 'mkarg']
>>> commands.getoutput("date")
'Fri Dec 10 11:53:04 CST 2021'
>>> commands.getstatusoutput("date")
(0, 'Fri Dec 10 11:53:58 CST 2021')

注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现错误:

参考链接:https://www.jb51.net/article/56490.htm

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值