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