Функции os.exec*()
принимают список аргументов для новой программы, загруженной в процесс. В каждом случае первый из этих аргументов передается новой программе как собственное имя, а не как аргумент, который пользователь мог ввести в командной строке. Для программиста на Си это argv[0]
, переданный в main()
программы. Например, os.execv('/bin/echo', ['foo', 'bar'])
будет печатать строку только при стандартном выводе, foo
будет казаться проигнорированным.
import os os.execl(path, arg0, arg1, ...) os.execle(path, arg0, arg1, ..., env) os.execlp(file, arg0, arg1, ...) os.execlpe(file, arg0, arg1, ..., env) os.execv(path, args) os.execve(path, args, env) os.execvp(file, args) os.execvpe(file, args, env)
path
- str
, путь в файловой системе запускаемой программы,arg0
, arg1
- аргументы командной строки запускаемой программы,file
- str
, файла запускаемой программы,args
- список аргументов командной строки запускаемой программы,env
- dict
- переменная среда для выполнения программы.Все эти функции выполняют новую программу, заменяя текущий процесс. Они ничего не возвращают. В Unix новый исполняемый файл загружается в текущий процесс и будет иметь тот же идентификатор процесса, что и вызывающая программа. Ошибки будут сообщаться как исключения OSError
.
Текущий процесс заменяется немедленно. Объекты и дескрипторы открытого файла не сбрасываются, поэтому, если в этих открытых файлах могут быть буферизованные данные, то перед вызовом функции os.exec*()
необходимо их очистить с помощью sys.stdout.flush()
или os.fsync()
.
Варианты 'l'
и 'v'
функций exec*()
отличаются тем, как передаются аргументы командной строки. С вариантами 'l'
работать легче всего, если число параметров фиксировано при написании кода, отдельные параметры просто становятся дополнительными параметрами для функций os.execl*()
. Варианты 'v'
хороши, когда число параметров является переменным, а аргументы передаются в списке или кортеже в качестве параметра args
. В любом случае аргументы дочернего процесса должны начинаться с имени выполняемой команды, но это не применяется.
Варианты, которые включают 'p'
в конце (os.execlp()
, os.execlpe()
, os.execvp()
и os.execvpe()
), будут использовать переменную среды PATH
для определения местоположения файла file
программы. Когда среда выполнения заменяется с использованием одного из вариантов os.exec*e()
, описанного в следующем параграфе, новая среда выполнения env
используется в качестве источника переменной PATH
. Другие варианты, os.execl()
, os.execle()
, os.execv()
и os.execve()
, не будут использовать переменную PATH
для поиска исполняемого файла. Путь должен содержать соответствующий абсолютный или относительный путь.
Для os.execle()
, os.execlpe()
, os.execve()
и os.execvpe()
, обратите внимание, что все они заканчиваются на 'e'
, параметр env
должен быть словарем, который используется для определения переменной среды для нового процесса, т. е. env
будет использоваться вместо среды текущего процесса. Функции os.execl()
, os.execlp()
, os.execv()
и os.execvp()
заставляют новый процесс наследовать среду текущего процесса.
Для os.execve()
на некоторых платформах путь path
также может быть указан как дескриптор открытого файла. Эта функциональность может не поддерживаться на вашей платформе. Вы можете проверить, доступен ли он, используя os.supports_fd
. Если он недоступен, его использование вызовет исключение NotImplementedError
.
Все эти функции вызывают событие аудита os.exec
с аргументами path
, args
, env
.
Доступность: Unix, Windows.