101

How can I run a python script with my own command line name like myscript without having to do python myscript.py in the terminal?


See also: Why do I get non-Python errors like "./xx.py: line 1: import: command not found" when trying to run a Python script on Linux? for a common problem encountered while trying to set this up on Linux/Mac, or 'From/import' is not recognized as an internal or external command, operable program or batch file for the equivalent problem on Windows.

3
  • 2
    What OS do you want do this on? Commented Dec 15, 2014 at 23:05
  • Mac OS X 10.10 Yosemite Commented Dec 15, 2014 at 23:07
  • See also: python - setup.py and adding file to /bin/ - Stack Overflow for detailed instruction on the setuptools console_scripts method. Commented Dec 6, 2021 at 6:31

5 Answers 5

154
  1. Add a shebang line to the top of the script:

    #!/usr/bin/env python

  2. Mark the script as executable:

    chmod +x myscript.py

  3. Add the dir containing it to your PATH variable. (If you want it to stick, you'll have to do this in .bashrc or .bash_profile in your home dir.)

    export PATH=/path/to/script:$PATH

Sign up to request clarification or add additional context in comments.

8 Comments

still cant run by my name 'square': -bash: /usr/bin/square: No such file or directory
My program is called square and i have exported the dir in PATH
@bingo14 What is the output of echo $PATH? And the absolute path to your script?
It is: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Development/adt-bundle/sdk/platform-tools:/Development/adt-bundle/sdk/tools
So that needs to be added to your path, like I showed in point 3 in my answer.
|
85

The best way, which is cross-platform, is to create setup.py, define an entry point in it and install with pip.

Say you have the following contents of myscript.py:

def run():
    print('Hello world')

Then you add setup.py with the following:

from setuptools import setup
setup(
    name='myscript',
    version='0.0.1',
    entry_points={
        'console_scripts': [
            'myscript=myscript:run'
        ]
    }
)

Entry point format is terminal_command_name=python_script_name:main_method_name

Finally install with the following command.

pip install -e /path/to/script/folder

-e stands for editable, meaning you'll be able to work on the script and invoke the latest version without need to reinstall

After that you can run myscript from any directory.

4 Comments

Is it possible to call entry points like myscript update or only myscript_update
@NikitaProkaiev In myscript update, update is a command line argument to the script -- the same as if you ran python myscript.py update. It would have no effect unless you wrote code in your script to handle command line arguments. You could define another entry in console_scripts like myscript_update=myscript:update to call, in this case, a function called update.
if you just have a python script then do pip install -e .
what if it is not a method but a script?
13

I usually do in the script:

#!/usr/bin/python
... code ...

And in terminal:

$: chmod 755 yourfile.py
$: ./yourfile.py

permission table

1 Comment

avoid hardcoding path to python, prefer /usr/bin/env python
3

Another related solution which some people may be interested in. One can also directly embed the contents of myscript.py into your .bashrc file on Linux (should also work for MacOS I think)

For example, I have the following function defined in my .bashrc for dumping Python pickles to the terminal, note that the ${1} is the first argument following the function name:

depickle() {
python << EOPYTHON
import pickle
f = open('${1}', 'rb')
while True:
   try:
      print(pickle.load(f))
   except EOFError:
      break
EOPYTHON
}

With this in place (and after reloading .bashrc), I can now run depickle a.pickle from any terminal or directory on my computer.

Comments

2

The simplest way that comes to my mind is to use "pyinstaller".

  1. create an environment that contains all the lib you have used in your code.
  2. activate the environment and in the command window write pip install pyinstaller
  3. Use the command window to open the main directory that codes maincode.py is located.
  4. remember to keep the environment active and write pyinstaller maincode.py
  5. Check the folder named "build" and you will find the executable file.

I hope that this solution helps you. GL

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.