竞争无处不在,青春永不言败!专业撸代码,副业修bug

Talk is cheap , show me the code!



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

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

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

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

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

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

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

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

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

 

用法:

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程序如下。 

1
2
3
4
5
6
7
8
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--ttt
1--bbb
2--ccc

posted @ 2018-07-04 17:46  云雾散人  阅读(2628)  评论(0编辑  收藏  举报

Your attitude not your aptitude will determine your altitude!

如果有来生,一个人去远行,看不同的风景,感受生命的活力!