Let's say that we have a Python script
do.py and we want to be able to call it without extension, like
If we rename the file from
do and assure we have a valid shebang line it will work for all platforms but Windows. On Windows there is no way of executing file without extension.
On Windows, if we keep the original file extension we'll be able to call the script without the full name because the Python installer registers the
.py extension as an executable one.
It looks that we need to deliver the same script under two different names in order to be call it on Windows and non-Windows environments. I really do not like this and I'm looking for a solution without this redundancy.
Another common approach on this is to add a
do.cmd wrapper batch file that is calling the original
do.py file. This has at least one major issue: it does break the Ctrl+C / Ctrl+Break because there is no way to prevent
cmd.exe from prompting you with Terminate batch job? (Y/N) message.
If we are about to use a wrapper we need to be sure that:
I suppose the optimal solution is still to use a wrapper. Batch won't work, native executable would add a lot of complexity so probably a wrapper wrote in python itself would do.
So far I came up with this solution that seams to work. Create a file
yourname.py with this content:
import os, sys filename = os.path.splitext(os.path.basename(sys.argv)) if not os.path.exists(filename): # filename does not exists, we will emulate cmd behaviour sys.stderr.write("'%s' is not recognized as an internal or external command,\noperable program or batch file." % filename) sys.exit(9009) ret = os.system("python %s %s" % ( filename, " ".join(sys.argv[1:]) )) exit(ret)
On windows i added the '.py' extension to the 'PATHEXT' environment variable and that works for me - if the .py file is stored in an directory that is part of the 'PATH' environment variable.
C:\>echo %PATHEXT% .COM;.EXE;.BAT;.CMD;.PY;.JS;.JSE