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
cd ~
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
python run.py
instead of
python ~/long/path/to/run.py
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.
EDIT
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.
1) Portable.
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 sh
and 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.
2) Executable
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.
3) Extension
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.
Therefore, writing run.py
would be bad because it would specify the filetype; it would be better to be able to write just run
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:
-m
module-name
Searchessys.path
for the named module and runs the corresponding.py
file as a script.
You can make a python script executable by adding
#!/usr/bin/env python
to the beginning of the file, and making it executable with chmod +x
.
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 run
program.
On POSIX (MacOs, linux) do what @Petr said, which is based on what @alberge said:
chmod +x
#!/usr/bin/env python
/usr/local/bin/
for all userscp -s
) the file under your PATH with basename pytest
instead of pytest.py
On windows:
C:\bin\
and ~\bin\
?.PY
to the PATHEXT
environment variable so that Windows will recognize files with python extension as runnable files without requiring you to type the extensionpython.exe
interpreter (Windows Explorer > right click > check "Always use the selected program"). There is an option on the python installer that does this for you.pytest
with extension into the dir under PATH
(using Link Shell Extension from Windows Explorer or mklink name dest
from cmd )Now system( "pytest" );
should work in both systems ( sh
under Linux, cmd
under Windows )