Is there a portable way to run a python script from a shell without writing its full path?
For example in Linux, I would like while in my home directory
to be able to run a python script called run.py that is in say, ~/long/path/to/run.py, but I want to run it by simply typing
I would hope for some kind of search path list that contains several directories just like the PATH variable, so that python run.py runs the first run.py it encounters in one of the directories.
I have considered turning run.py into an executable and adding its directory the system PATH variable, but could not find a portable way of making a python script executable.
One year later after asking it, I am a bit less noob, and I see that my question was not very clear and did not make much sense, so after a question upvote I'll clarify some things.
When I asked this I said portable. However what portable means is not clear in this case, and I did not give much emphasis to it.
the platforms: should work on POSIX (Linux, MacOS, etc.) and Windows
this still does not make much sense since windows uses
cmd.exe, and POSIX uses
sh, so each one could run the commands with a different syntax. So let's say that the most portable thing possible would be to feed the same input to both
cmd.exe, running the python script in both cases. In this case, you could run the same command from an ANSI C
system function, which uses
sh on POSIX and
cmd on Windows. ANSI C being one of the few things that is common to Windows and POSIX, the question makes some sense in that case.
Next, the phrase
turning run.py into an executable, is not very clear. By that I was talking about the Linux strategy of
chmod +x run.py, add a shebang
#!/usr/bin/env python, and adding its directory the system add ~/long/path/to/ the PATH enviroment variable. But then this won't work for windows because windows does not support an executable file metadata property like Linux and because /usr/bin/env does not necessarily exist in Windows.
Finally, in my head I was hoping for a solution that does not specify what kind of file run is, so that if someday we decide to make it, say, a perl file, no interfaces would change.
run.py would be bad because it would specify the filetype; it would be better to be able to write just
If the directory containing
run.py is on the module search path (for example,
PYTHONPATH environment variable), you should be able to run it like this:
python -m run
Here is the documentation on the
-m command line option:
sys.pathfor the named module and runs the corresponding
.pyfile as a script.
You can make a python script executable by adding
to the beginning of the file, and making it executable with
Answer after the clarification edit
I prefer the following approach to the one suggested by @F.J. because it does not require users to specify the file type. Please note that this was not specified in the original question, so his answer to the original question was correct.
Lets call the file
pytest.py to avoid conflicts with a possible existing
On POSIX (MacOs, linux) do what @Petr said, which is based on what @alberge said:
/usr/local/bin/for all users
cp -s) the file under your PATH with basename
PATHEXTenvironment variable so that Windows will recognize files with python extension as runnable files without requiring you to type the extension
python.exeinterpreter (Windows Explorer > right click > check "Always use the selected program"). There is an option on the python installer that does this for you.
pytestwith extension into the dir under
PATH(using Link Shell Extension from Windows Explorer or
mklink name destfrom cmd )
system( "pytest" ); should work in both systems (
sh under Linux,
cmd under Windows )