python os.exec*()家族函数的用法

execl(file, arg0,arg1,...) 用参数列表arg0, arg1 等等执行文件python

execv(file, arglist) 除了使用参数向量列表,其余的和execl()相同ide

execle(file, arg0,arg1,... env) 和execl 相同,但提供了环境变量字典env函数

execve(file,arglist, env) 除了带有参数向量列表,其余的和execle()相同spa

execlp(cmd, arg0,arg1,...) 于execl()相同,可是在用户的搜索路径下搜索彻底的文件路径名cmd

execvp(cmd, arglist) 除了带有参数向量列表,与execlp()相同it

execlpe(cmd, arg0, arg1,... env) 和execlp 相同,但提供了环境变量字典env编译

execvpe(cmd,arglist, env) 和execvp 相同,但提供了环境变量字典envclass


用法:
test

os.execl("/usr/bin/python ", "test.py ",`'i ')这样写是不行的,变量

要这样 

os.execl("/usr/bin/python ", "python ", 'test.py ', 'i ') 

os.exec*()都只是posix系统的直接映射,因此os.execl的第一个参数 "/usr/bin/python "是程序的可执行文件,而其余的都是program argument,就是c中int main(int argc,char** argv)中的argv。 
而python的sys.argv应是c中argv的[1:],因此os.execl中的第二个参数 "python "对于python程序test.py不可见并且没有用。 
实际上os.execl的第二个参数也就是int main(int argc,char** argv)中的argv[0]能够是任意的,它本质上是提供给c程序做为main()函数的第一个参数使用。


好比你写一个c程序以下。 

int main(int argc, char** argv) 
{ 
        int i; 
        for(i=0; i<argc; i++) 
        { 
              printf( "%d--%s\n", i, argv[i]); 
        }       
}

编译成aaa 

若是你单独执行 
/path/to/aaa bbb ccc
这时会打印
0--/path/to/aaa
1--bbb
2--ccc
实际上Shell执行execl("/path/to/aaa", "/path/to/aaa", "bbb", "ccc")把argv[0]设置为/pat/to/aaa。
产生一个误解就是认为execl中第二个参数必须是 "/path/to/aaa"的程序名,其实否则。 

而用os.execl( "/path/to/aaa", "ttt", 'bbb', 'ccc') 则打印 0--ttt1--bbb2--ccc

相关文章
相关标签/搜索