os.exec*的第一个参数

10 投票
1 回答
6606 浏览
提问于 2025-04-15 23:08

来自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'])

撰写回答