os.exec*的第一个参数
来自Python文档的内容:
各种exec*()函数会接收一个参数列表,用于加载到进程中的新程序。在每种情况下,这些参数中的第一个会被当作新程序的名称,而不是用户在命令行上输入的参数。对于C语言程序员来说,这就相当于传递给程序main()的argv[0]。举个例子,os.execv('/bin/echo', ['foo', 'bar']) 只会在标准输出上打印bar;foo会被忽略。
有人能帮我理解一下这个内容吗?如果我想运行自己的程序并传递一些参数,我该怎么做呢?
1 个回答
21
UNIX系统是这些exec
命令的来源,它把程序的可执行文件和程序的名字分开,这样你的进程可以有任何你想要的名字。
第一个参数是要运行的程序,这个程序必须存在。接下来的参数是你运行这个程序的进程将被称作什么,也就是argv[0]
的内容,以及在ps
(进程列表)中显示的名字。
比如,如果我写了(用C语言,但在Python中也是一样):
execl ("/usr/bin/sleep", "notsleep", "60", NULL);
这段代码会运行/usr/bin/sleep
这个程序,但在进程列表中显示的名字是notsleep
。在这里,argv[0]
就是notsleep
,而argv[1]
(实际的参数)是60。通常情况下,前两个参数是相同的,但这并不是必须的。
这就是为什么你列表中的第一个参数看起来被“忽略”了。它是给进程起的名字,而不是传给它的第一个参数。
更正确的写法应该是:
os.execv('/bin/echo', ['echo', 'foo', 'bar'])