Разница между os.execl() и os.execv() в python

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

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

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

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

os.execv(__file__,sys.argv)

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

Чтобы узнать больше о том, что я пытаюсь сделать, см. my другой вопрос


person Rohin Kumar    schedule 16.07.2015    source источник
comment
execl и execv — это команды операционной системы, вы можете прочитать их документацию, набрав man execl (или перейти здесь).   -  person DanielGibbs    schedule 16.07.2015


Ответы (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 — если это не удастся выполнить, вы в конечном итоге «продолжите с того места, где остановились».

person nneonneo    schedule 16.07.2015
comment
Интересный! это связано с тем, как он перезапускает скрипт? - person Rohin Kumar; 16.07.2015
comment
Разница между execl и execv никак не повлияет на перезапуск скрипта, если только вы не передадите им разные аргументы. - person nneonneo; 16.07.2015
comment
Хм... Я действительно вижу перезапуск программы перед моими глазами (интерфейс закрывается и запускается снова). Так что я сомневаюсь, что продолжу спор там, где остановился. - person Rohin Kumar; 16.07.2015
comment
Хорошо, так что, черт возьми, вы подразумеваете под началом с того места, где оставил предыдущий сценарий? Если вы ясно видите, что программа перезапускается, но она все равно запускается из предыдущего состояния, значит, у вас ошибка в коде (или ваш код каким-то образом восстанавливает свое состояние). - person nneonneo; 16.07.2015
comment
Я специалист по аппаратному обеспечению, впервые пытающийся закодировать полноценный скрипт Python... так что будьте осторожны, если я скажу что-то не так... я имел в виду, что когда код перезапускается, вместо этого он застревает в том же цикле исходящих из линии 1 скажем. (У меня также есть поток.) ​​Может быть, вы можете посмотреть код здесь (stackoverflow.com/questions/31358737/) - person Rohin Kumar; 16.07.2015
comment
Я также имел в виду эту строку Текущий процесс немедленно заменяется здесь docs .python.org/2/library/os.html#os.execlp - person Rohin Kumar; 16.07.2015
comment
Теперь совершенно ясно, что у вас проблема XY. На самом деле вы не хотите перезапускать программу — вы хотите немного подождать, а затем повторить операцию. Могу ли я предложить цикл while с time.sleep()? - person nneonneo; 16.07.2015
comment
Спасибо, что помогли мне лучше участвовать в форумах... Посмотрим, действительно ли поможет sleep(n) - person Rohin Kumar; 16.07.2015
comment
А теперь подумай, ты меня неправильно понял! Я ХОЧУ перезапустить программу... сон в моем случае бесполезен, так как пользовательский интерфейс будет зависать. не проблема XY ... Я дал фон как ссылку на то, что происходило в моей программе! - person Rohin Kumar; 17.07.2015

Согласно документации Python, между execv и execl:

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

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

person DanielGibbs    schedule 16.07.2015
comment
Я получил эту идею от blog.petrzemek. net/2014/03/23/. Посмотрите раздел «Перезапуск скрипта». - person Rohin Kumar; 16.07.2015
comment
Да, в этом разделе сказано, что execv... запускает выполнение текущего скрипта с самого начала. Нет никаких оснований предполагать, что execl поступит иначе. - person DanielGibbs; 16.07.2015
comment
ну... мой скрипт застревает в том же цикле даже после перезапуска, когда я использую execl. Не уверен насчет execv, потому что это вызвано какой-то случайной аппаратной проблемой. - person Rohin Kumar; 16.07.2015
comment
Что ж, это отдельная проблема с вашим сценарием, но она не должна иметь ничего общего с использованием вами execv/execl. - person DanielGibbs; 16.07.2015
comment
! если это так, то execv также должен застрять в том же цикле. Я сообщу, когда это произойдет... так как это происходит случайно, я не знаю когда... В любом случае, спасибо за ваш вклад! - person Rohin Kumar; 16.07.2015