(Слегка неработающий) код для перезапуска программы Python с использованием ее собственного интерпретатора, его аргументов и замены процесса заключается в использовании одной из функций os.exec
, например os.execl
.
os.execl(path, arg0, arg1, ...)
...
Все эти функции выполняют новую программу, заменяя текущий процесс; они не возвращаются. В Unix новый исполняемый файл загружается в текущий процесс и будет иметь тот же идентификатор процесса, что и вызывающая программа. Ошибки будут сообщаться как исключения OSError.
Итак, я сделал это:
import os,sys
def restart_program():
"""Restarts the current program, with file objects and descriptors
cleanup
"""
print("restarting")
python = sys.executable
os.execl(python, python, *sys.argv)
restart_program()
Я получаю:
C:\Program: can't open file 'Files\Python36\python.exe': [Errno 2] No such file or directory
Ясно, что случай "чертов путь с пробелами". За исключением того, что это не должно происходить, потому что я сам не составлял командную строку, а передавал аргументы чисто.
Чтобы это работало, поскольку arg0
(обычно) игнорируется, я бы сделал (например):
os.execl(python, "python.exe", *sys.argv)
теперь программа работает.
Так баг или версия windows "фича"?