前言:今天在写代码的时候,遇到了一个自己的盲区... 调试了蛮久,才解决...

问题:例如:os.system("cd /home/test/data") 这样并不能够成功的将路径切换的/home/test/data下...

1 import os
3 name="mmm"
4 os.system("mkdir %s" % name)
5 r = os.path.join(os.popen("pwd").readlines()[0][:-1], name)
6 os.system("cd %s " % r)
7 os.system("git init")

os.system的工作原理:Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system(), and has the same limitations...

  • 关于子进程的创建需要明确两点:父进程的环境变量(environment variables)会默认传递到子进程中(工作目录PWD就是环境变量之一)
  • 使用system函数,子进程无法影响父进程中的环境变量
  • 根据这两点,执行os.system(path)引发的工作目录变更作用范围仅限于第一个被创建的子进程,故而当前的工作目录没有变更,到执行os.system("git init")就会报错。

    就是:os.system()的每一次操作都是开启一个子进程,操作完成后,会返回父进程,但是无法改变父进程的环境变量。

    解决办法:

    采用&&连接多个命令,即可。
    1 os.system(‘cd hello && ls’) 
    2 # 或者 
    3 os.system(‘cd hello’;’ls’)
  • 使用os提供的os.chdir(‘/home/data)
  •