Question: In a program I am writing in python I need to completely restart the program if a variable becomes true, looking for a while I found this command:

```
while True:
    if reboot == True:
        os.execv(sys.argv[0], sys.argv)

```

When executed it returns the error `[Errno 8] Exec format error`. I searched for further documentation on `os.execv`, but didn't find anything relevant, so my question is if anyone knows what I did wrong or knows a better way to restart a script (by restarting I mean completely re-running the script, as if it were been opened for the first time, so with all unassigned variables and no thread running).

Answer: 
There are multiple ways to achieve the same thing. Start by modifying the program to exit whenever the flag turns `True`. Then there are various options, each one with its advantages and disadvantages.

Wrap it using a bash script.
============================

The script should handle exits and restart your program. A really basic version could be:

```
#!/bin/bash
while :
do
    python program.py
    sleep 1
done

```

Start the program as a sub-process of another program.
======================================================

Start by wrapping your program's code to a function. Then your `__main__` could look like this:

```
def program():
  ### Here is the code of your program
  ...

while True:
  from multiprocessing import Process
  process = Process(target=program)
  process.start()
  process.join()
  print("Restarting...")

```

This code is relatively basic, and it requires error handling to be implemented.

Use a process manager
=====================

There are a lot of tools available that can monitor the process, run multiple processes in parallel and automatically restart stopped processes. It's worth having a look at [PM2](https://github.com/Unitech/pm2) or similar.

IMHO the third option (process manager) looks like the safest approach. The other approaches will have edge cases and require implementation from your side to handle edge cases.
This has worked for me. Please add the shebang at the top of your code and **os.execv()** as shown below

```
#!/usr/bin/env python3
import os
import sys

if __name__ == '__main__':
    while True:
        reboot = input('Enter:')
        if reboot == '1':
            sys.stdout.flush()
            os.execv(sys.executable, [sys.executable, __file__] + [sys.argv[0]])
        else:
            print('OLD')

```