Первый параметр os.exec * - PullRequest
9 голосов
/ 25 мая 2010

Из документации по питону:

Различные функции exec * () принимают список аргументов для новой программы загружен в процесс. В каждом случае, первый из этих аргументов пройден к новой программе как собственное имя а не в качестве аргумента пользователь может набрал в командной строке. Для C программист, это argv [0] передан в main программы (). За Например, os.execv ('/ bin / echo', ['foo', 'bar']) будет печатать только бар на стандартный вывод; фу будет казаться игнорироваться.

Может кто-нибудь помочь мне понять это? Что мне нужно сделать, если я хочу запустить собственную программу с некоторыми параметрами?

1 Ответ

18 голосов
/ 25 мая 2010

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'])
...