2015-07-16 2 views
0

Есть ли разница между os.execl() и os.execv() в python? Я использовалРазница между os.execl() и os.execv() в python

os.execl(python, python, *sys.argv) 

перезагрузить скрипт (из here). Но, похоже, он начинается с того места, где вышел предыдущий скрипт.

Я хочу, чтобы сценарий начинался с самого начала, когда он перезапускается. Будет ли это

os.execv(__file__,sys.argv) 

выполнить эту работу? command and idea from here. Я не мог найти разницу между ними из справки/документации python. Есть ли способ очистить перезапуск?

Для немного больше фона на то, что я пытаюсь сделать, пожалуйста, см my other question

P.S. Я парень-аппаратчик ... так что будь ласковым!

+0

'execl' и' execv' - это операционные системные команды, вы можете прочитать их документацию, набрав 'man execl' (или перейдите [здесь] (http://linux.die.net/man/3/execl)) , – DanielGibbs

ответ

2

На низком уровне они делают то же самое: они заменяют изображение рабочего процесса новым процессом.

Разница только между execv и execl путь они принимают аргументы. execv ожидает один список аргументов (первым из которых должно быть имя исполняемого файла), а execl ожидает переменный список аргументов.

Таким образом, по существу, execv(file, *args) в точности эквивалентен execl(file, args).


Отметьте, что sys.argv[0] уже является именем сценария. Однако это имя скрипта, переданное в Python, и не может быть фактическим именем сценария, в котором работает программа. Для того, чтобы быть правильно и безопасно, ваш список аргументов передается exec* должны быть

['python', __file__] + sys.argv[1:] 

Я просто проверял сценарий перезагрузки со следующим:

os.execl(sys.executable, 'python', __file__, *sys.argv[1:]) 

и это работает отлично. Убедитесь, что вы не игнорируете или не получаете никаких ошибок от execl - если он не выполняется, вы в конечном итоге «продолжаете то, где вы остановились».

+0

Интересно! связано ли это с тем, как он перезапускает скрипт? –

+0

Разница между 'execl' и' execv' вообще не влияет на перезапуск скрипта, если вы не передадите им разные аргументы. – nneonneo

+0

Хм ... Я действительно вижу перезапуск программы перед глазами (у меня закрыт пользовательский интерфейс и начнется снова). Поэтому я сомневаюсь, что аргумент «продолжаю, где я остановился» –

0

Согласно Python documentation нет никакой реальной функциональной разницы между execv и execl:

«L» и «V» варианты EXEC * функции различаются в том, как передаются аргументы командной строки. Варианты «l», пожалуй, проще всего работать, если число параметров фиксировано при написании кода; отдельные параметры просто становятся дополнительными параметрами для функций execl *(). Варианты «v» хороши, когда число параметров является переменным, причем аргументы передаются в списке или кортеже как параметр args. В любом случае аргументы дочернего процесса должны начинаться с имени выполняемой команды, но это не выполняется.

Не знаю, почему, похоже, кто-то перезапускает сценарий, где он остановился, но я бы предположил, что это не связано.

+0

У меня появилась идея от http://blog.petrzemek.net/2014/03/23/restarting-a-python-script-within-itself/. Посмотрите раздел «Перезапуск сценария» –

+0

Да, в этом разделе говорится, что 'execv' ... ... начинает выполнение текущего скрипта с самого начала». Нет ничего, чтобы предположить, что 'execl' будет делать иначе. – DanielGibbs

+0

хорошо ... мой скрипт застревает в том же цикле даже после перезапуска, когда я использую 'execl'. Не уверен насчет 'execv' coz, это связано с какой-то случайной аппаратной проблемой. –

Смежные вопросы