os.system接口

2020年7月3日 / 17次阅读 / Last Modified 2020年7月3日
os模块多进程

虽然创建子进程,python推荐使用subprocess模块,因为可以更好的与子进程交互。不过,os.system接口还是有用武之地。

os.system底层调用的C标准接口system,它只能返回子进程的返回码,而无法与子进程进行复杂交互。我们就简单理解它可以直接在python代码中执行shell命令吧,子进程的输出会直接出现的父进程的stdout内。

>>> a = os.system('ls -ahl')
total 56K
drwxr-xr-x 5 pi pi 4.0K Jul  3 14:22 .
drwxr-xr-x 5 pi pi 4.0K Jun 24 12:00 ..
-rw-r--r-- 1 pi pi 2.9K Jun 18 20:49 common.py
-rw-r--r-- 1 pi pi  164 Jun 18 20:49 config.ini
drwxr-xr-x 8 pi pi 4.0K Jul  3 10:01 .git
drwxr-xr-x 2 pi pi 4.0K Jul  3 10:00 __pycache__
-rw-r--r-- 1 pi pi   48 Jun  7 22:17 README.md
-rw-r--r-- 1 pi pi  603 Jun 18 20:49 start.py
-rw-r--r-- 1 pi pi  16K Jul  3 10:00 tcp_server.py
drwxr-xr-x 2 pi pi 4.0K Jul  2 10:48 test
-rw-r--r-- 1 pi pi 2.1K Jun 18 20:49 udp_hb.py
>>> a
0

关于子进程的创建需要明确两点: (1)父进程的环境变量(environment variables)会默认传递到子进程中(工作目录PWD就是环境变量之一) (2) 使用os.system函数,子进程无法影响父进程中的环境变量

有时我们在python中调试代码的时候,还是挺方便的。比如上面的示例,查看一下某个路径的文件列表,或者在不离开当前python环境的情况下,启动一个后台进程。

我个人比较喜欢这样:在需要的时候,用os.system启动一个新的bash子进程,干活事情后,再回到原来的python环境,这样原来环境中的符号都不会丢失!

>>> os.system('bash')
pi@rpi01:~/repos/cook $ ll
total 44
-rw-r--r-- 1 pi pi  2908 Jun 18 20:49 common.py
-rw-r--r-- 1 pi pi   164 Jun 18 20:49 config.ini
drwxr-xr-x 2 pi pi  4096 Jul  3 10:00 __pycache__
-rw-r--r-- 1 pi pi    48 Jun  7 22:17 README.md
-rw-r--r-- 1 pi pi   603 Jun 18 20:49 start.py
-rw-r--r-- 1 pi pi 16340 Jul  3 10:00 tcp_server.py
drwxr-xr-x 2 pi pi  4096 Jul  2 10:48 test
-rw-r--r-- 1 pi pi  2130 Jun 18 20:49 udp_hb.py
pi@rpi01:~/repos/cook $ exit
exit
0

这有点像在vim中启动一个bash,干活事情再回到vim一样!

在不需要与子进程做信息交换的场景下,感觉使用os.system比使用subprocess要简单直接一些!

-- EOF --

本文链接:https://www.pynote.net/archives/2125

留言区

《os.system接口》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    如果在程序中使用os.system,小心它会弄乱你的程序的输出,因为os.system的子进程的输出不受控制,会直接出现在父进程的stdout中。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top