
Paul, I understand what you say, except the part of compatibility with Python3.5. Of course such a change is targeting future version more than the current and previous versions. If we have this syntax for Python3.6, users of Python3.9 will find many copy-pastable answers written this way, and other answers will have comments saying "just add this statement to the beginning of your script". On Mon, Sep 19, 2016 at 11:24 PM Paul Moore <p.f.moore@gmail.com> wrote:
On 19 September 2016 at 19:52, אלעזר <elazarg@gmail.com> wrote:
Of course it doesn't address the issues - for example, running a python script from the file manager will result in a failed execution, unexplained.
What you're talking about here is deployment of Python "applications" (where in your case, you're focusing on single-file scripts, but the problem is broader). Beyond a certain point, as I'm sure you realise, you can't solve this issue - someone tries to run a Unix-only script on Windows, for example. So really, we're looking at ways of improving the current state of affairs. As things stand, deploying "standalone applications" in Python is not particularly easy, with dependency management being only one of the issues.
Some options for deployment come to mind - I'm sure none of them seem quite as easy as "just run this script", but you should remember that even "just run this script" doesn't always work as well as you'd like - on Unix you need to make the script executable and have a shebang line, on Windows the file extension needs to be right and registered. Not all users have the right (or sometimes any) Python version on their PATH, etc. So even "just run this script" isn't always simple even if the script has no dependencies outside the stdlib.
So, some options:
1. The previously-mentioned rwt makes "just run this script" work as you want, as long as you have rwt installed. Conceded, it isn't available by default, but it's not hard to install as a one-off task. And there's a discussion ongoing about including it with pip as "pip run" so "pip run myscript.py" (or "py -m pip run myscript.py" on Windows - remember what I said about PATH? ;-)) will run a script with its dependencies. 2. You can bundle your script with its dependencies using zipapp. On Unix, you can even make the resulting file executable, and on Windows, the .pyz extension is registered for this. 3. Someone could write a tool to scan a script for a specially-formatted comment at the top that described its dependencies, and installed them. That (in effect) adds an "install" step before the script can be run, but lots of utilities have that, so it's not completely unheard of. And if it's GUI users you're concerned about, you could make that a GUI utility. Drag the script onto it, it lists the dependencies and confirms you want them installed, then offers to run the script. 4. There are existing platform-specific options like py2exe or cx_Freeze. Probably a bit heavyweight for a "simple script", though.
Of course, none of these options cover the use case of "I saw this nice script on Stack Overflow, so I copied it, and now I want to run it on my PC". But honestly, if it has some dependencies, and the script author didn't say "you need to install FOO and BAR", or the user doesn't know how to install those dependencies, you're probably out of luck anyway. Even if the proposed "from __pypi__ import foo" syntax existed, I doubt many scripts posted on the web would use it - if only because then, Python 3.5 users wouldn't be able to run the scripts!
IMO, for command line use, rwt is 99% of the way to what you want. For GUI use, there's nothing specific to this problem right now, but someone could certainly write something. A syntax change to the language would likely be *less* useful, as people would not be able to use it unless they were deliberately only targeting Python 3.7 and later, which seems optimistic at best...
Paul