I’ll second @adramelech here and say pyinstaller. However, it can be troublesome when building from larger projects that utilize a lot of libraries outside the python standard library or non-python files (like images, config files, and data files). To pyinstaller, there are often “hidden dependencies” in many python libraries that don’t get automatically pulled in when you run it. I have this issue whenever I use pandas for instance. No errors generated until I run the executable (if it runs at all). To get around that there is a config file that you can have pyinstaller generate and than edit it to pull in all the things it needs to make an executable. You will likely need to dive into their more advanced documentation sections for this.
I would consider trying auto-py-to-exe first. It uses pyinstaller under the hood but walks you through the process with a GUI and I find it makes tweaking some of pyinstaller’s more advanced settings and adding in dependency files easier.
Also, I would suggest making sure any anti-virus software you may have running isn’t interfering with the executable or pyinstaller.
Alternatively, while I know it’s not nearly as convenient as an executable and isn’t always appropriate for a lot of use cases, have you thought about using a bash/batch script?