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

Posted 拂髯客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转---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 ", 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

以上是关于转---python os.exec*()家族函数的用法的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 os.exec

在 Go os/exec 命令中激活 Python venv

Go语言中用 os/exec 执行命令的五种姿势

获取 os.exec 的输出以显示执行命令的进度

Golang os/exec 实现

[go]os/exec执行shell命令