Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run a python script without specifying the file extension (cross platform solution)?

Let's say that we have a Python script do.py and we want to be able to call it without extension, like do or ./do.

If we rename the file from do.py to 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:

  • return the errorcode (errorlevel) returned by the original script
  • it will not change the environment
  • it will reuse the same console (no new windows)
  • doesn't interfere with STDOUT, STDIN or STDERR
  • be friendly with Ctrl-C (no prompts)

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.

like image 953
sorin Avatar asked Feb 04 '23 05:02

sorin


2 Answers

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
like image 58
RoMa Avatar answered Feb 05 '23 19:02

RoMa


Write your main Python module with a .py extension. Set up PATHEXT correctly, and it will run on Windows without having to type the extension.

On Unix, write a second Python program that simply imports the first, using she-bang syntax. No extension on this file - it's a shell script. Like this:

#!/usr/bin/env python
import do

This will have the effect of importing do.py.

Only do needs to be marked as executable for Unix. do.py is a module in that environment.

When you import a module, the code in the module is run once.

It doesn't completely remove redundancy, but it's close. And it is probably the best solution possible for cross-platform scripting.

like image 33
Jason Avatar answered Feb 05 '23 19:02

Jason