How to run a Python script portably without specif

2019-03-15 18:51发布

问题:

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

回答1:

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
Searches sys.path for the named module and runs the corresponding .py file as a script.



回答2:

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.



回答3:

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
  • add shebang #!/usr/bin/env python
  • create a directory and add it to path. Usual locations on Linux are: ~/bin/ for a single user, /usr/local/bin/ for all users
  • symlink (cp -s) the file under your PATH with basename pytest instead of pytest.py

On windows:

  • create a dir and add it to PATH. AFAIK, there is no conventional place for that, so why not C:\bin\ and ~\bin\?
  • add .PY to the PATHEXT environment variable so that Windows will recognize files with python extension as runnable files without requiring you to type the extension
  • associate python files with the python.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.
  • symlink 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 )



回答4:

  1. Make python file executable (as "alberge" stated above)
  2. Create some directory and put this directory into your PATH variable
  3. In this directory, create links to your python scripts