24. Python 执行 linux 命令
24.1. os.system
os.system("cmd")
返回值是 shell 指令运行后返回的状态码,0 表示 shell 指令成功执行;256 表示未找到。该方法适用于 shell 命令不需要输出内容的场景。
1>>> import os
2>>> res = os.system("pwd")
3/data6/fong/maskrcnn_env/
4>>> res
50
6>>> os.system("echo \"hello world\"")
7hello world
80
24.2. os.popen
os.popen("cmd")
返回一个类文件对象。当需要得到外部程序的输出结果时,本方法非常有用。调用该对象的 read()/readline()/readlines()
方法可以读取输出内容。
1>>> import os
2>>> res = os.popen("pwd")
3>>> res
4<os._wrap_close object at 0x7fa0b279ccf8>
5>>> res.read() ## 读取所有内容,放到一个字符串中
6'/data6/fong/maskrcnn_env\n'
7
8>>> res = os.popen("pwd")
9>>> res.readline()
10'/data6/fong/maskrcnn_env\n'
11
12>>> res = os.popen("pwd")
13>>> res.readlines()
14['/data6/fong/maskrcnn_env\n']
24.3. subprocess
subprocess 模块允许我们启动一个新进程,并连接到它们的 stdin/stdout/stderr 管道,从而获取返回值。
24.3.1. 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
。shell
:如果该参数为True
,将通过操作系统的 shell 执行指定的命令。
1>>> import subprocess
2
3>>> res = subprocess.run(["ls", "-l", "./code"])
4total 52
5drwxrwxr-x 11 fong fong 4096 3月 13 19:19 Clothes-Detection
6drwxrwxr-x 6 fong fong 4096 3月 13 11:37 DeepFashion2
7drwxrwxr-x 6 fong fong 4096 3月 13 19:23 Deep-Fashion-Analysis-ECCV2018
8drwxrwxr-x 5 fong fong 4096 3月 13 11:43 DeepFashion-retrieval-2019
9drwxrwxr-x 7 fong fong 36864 4月 1 13:20 utils
10>>> res
11CompletedProcess(args=['ls', '-l', './code'], returncode=0)
12
13>>> res = subprocess.run(["ls", "./code"], stdout=subprocess.PIPE)
14>>> res
15CompletedProcess(args=['ls', './code'], returncode=0, stdout=b'Clothes-Detection\nDeepFashion2\nDeep-Fashion-Analysis-ECCV2018\nDeepFashion-retrieval-2019\nutils\n')
16>>> res.stdout
17b'Clothes-Detection\nDeepFashion2\nDeep-Fashion-Analysis-ECCV2018\nDeepFashion-retrieval-2019\nutils\n'
24.3.2. Popen
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
1>>> import subprocess
2>>> p = subprocess.Popen("echo 16", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
3>>> res = p.stdout.read()
4>>> type(res)
5<class 'bytes'>
6>>> res
7b'16\n'
8>>> float(res)
916.0
24.4. pbs
需要安装 pbs 包(更新后为 sh 包)。
1>>> import sh as pbs
2>>> pbs.ls("/")
3bin data1 data5 home lib32 mnt run sys vmlinuz
4boot data2 data6 initrd.img lib64 opt sbin tmp vmlinuz.old
5cdrom data3 dev initrd.img.old lost+found proc snap usr
6core data4 etc lib media root srv var
7>>> pbs.which("python")
8'/home/fong/anaconda3/envs/maskrcnn_benchmark/bin/python'
24.5. 附录:os 常用命令
os.remove
删除文件os.rename
重命名文件os.walk
生成目录树下的所有文件名os.chdir
改变目录os.mkdir/os.makedirs
创建目录/多层目录os.rmdir/os.removedirs
删除目录/多层目录os.listdir
列出指定目录的文件os.getcwd
取得当前工作目录os.chmod
改变目录权限os.path.basename
去掉目录路径,返回文件名os.path.dirname
去掉文件名,返回目录路径os.path.join
将分离的各部分组合成一个路径名os.path.getsize
返回文件大小os.path.exists
是否存在os.path.isabs
是否为绝对路径os.path.isdir
是否为目录os.path.isfile
是否为文件
24.6. 参考资料
python调用linux命令的方法
subprocess — Subprocess management
Python3 subprocess