Question :
If I have a basic Python script, with it’s hashbang and what-not in place, so that from the terminal on Linux I can run
/path/to/file/MyScript [args]
without executing through the interpreter or any file extensions, and it will execute the program.
So would I install this script so that I can type simply
MyScript [args]
anywhere in the system and it will run? Can this be implemented for all users on the system, or must it be redone for each one? Do I simply place the script in a specific directory, or are other things necessary?
Answer #1:
The best place to put things like this is /usr/local/bin
.
This is the normal place to put custom installed binaries, and should be early in your PATH
.
Simply copy the script there (probably using sudo
), and it should work for any user.
Answer #2:
Walkthrough of making a python script available anywhere:
Make a python script:
cd /home/el/bin
touch stuff.py
chmod +x stuff.py
Find out where your python is:
which python
/usr/bin/python
Put this code in there:
#!/usr/bin/python
print "hi"
Run in it the same directory:
python stuff.py
Go up a directory and it’s not available:
cd ..
stuff.py
-bash: stuff.py: command not found
Not found! It’s as we expect, add the file path of the python file to the $PATH
vi ~/.bashrc
Add the file:
export PATH=$PATH:/home/el/bin
Save it out, re apply the .bashrc, and retry
source ~/.bashrc
Try again:
cd /home/el
stuff.py
Prints:
hi
The trick is that the bash shell knows the language of the file via the shebang.
Answer #3:
The quick answer is to symlink
your script to any directory included in your system $PATH
.
The long answer is described below with a walk through example, (this is what I normally do):
a) Create the script e.g. $HOME/Desktop/myscript.py
:
#!/usr/bin/python
print("Hello Pythonista!")
b) Change the permission of the script file to make it executable:
$ chmod +x myscript.py
c) Add a customized directory to the $PATH
(see why in the notes below) to use it for the user’s scripts:
$ export PATH="$PATH:$HOME/bin"
d) Create a symbolic link to the script as follows:
$ ln -s $HOME/Desktop/myscript.py $HOME/bin/hello
Notice that hello
(can be anything) is the name of the command that you will use to invoke your script.
Note:
i) The reason to use $HOME/bin
instead of the /usr/local/bin
is to separate the local scripts from those of other users (if you wish to) and other installed stuff.
ii) To create a symlink you should use the complete correct path, i.e.
$HOME/bin
GOOD ~/bin
NO GOOD!
Here is a complete example:
$ pwd
~/Desktop
$ cat > myscript.py << EOF
> #!/usr/bin/python
> print("Hello Pythonista!")
> EOF
$ export PATH="$PATH:$HOME/bin"
$ ln -s $HOME/Desktop/myscript.py $HOME/bin/hello
$ chmod +x myscript.py
$ hello
Hello Pythonista!
Answer #4:
Just create ~/bin
and put export PATH=$PATH:$HOME/bin
in your bashrc/profile. Don’t mess with the system, it will bite you back, trust me.
Few more things (relevant to the question but not part of the answer):
- The other way
export PATH=$HOME/bin:$PATH
is NOT safe, for bash will will look into your~/bin
folder for executables, and if their name matches with other executables in your original$PATH
you will be surprised by unexpected/non working command execution. - Don’t forget to
chmod+x
when you save your script in~/bin
. - Be aware of what you are putting in your
~/bin
folder, if you are just testing something or working on unfinished script, its always better to use ./$SCRIPT_NAME from yourCWD
to execute the script than putting it under~/bin
.
Answer #5:
Just create symbolic link to your script in /usr/local/bin/:
sudo ln -s /path/to/your/script.py /usr/local/bin/script
Answer #6:
Putting the script somewhere in the PATH (like /usr/local/bin
) is a good solution, but this forces all the users of your system to use/see your script.
Adding an alias in /etc/profile
could be a way to do what you want allowing the users of your system to undo this using the unalias
command. The line to be added would be:
alias MyScript=/path/to/file/MyScript
Answer #7:
you can also use setuptools
(https://pypi.org/project/setuptools/)
- your script will be:
def hi():
print("hi")
(suppose the file name is hello.py
)
-
also add
__init__.py
file next to your script (with nothing in it). -
add
setup.py
script, with the content:
#!/usr/bin/env python3
import setuptools
install_requires = [
'WHATEVER PACKAGES YOU NEED GOES HERE'
]
setuptools.setup(
name="some_utils",
version="1.1",
packages=setuptools.find_packages(),
install_requires=install_requires,
entry_points={
'console_scripts': [
'cool_script = hello:hi',
],
},
include_package_data=True,
)
- you can now run
python setup.py develop
in this folder - then from anywhere, run
cool_script
and your script will run.
Answer #8:
Type echo $PATH
in a shell. Those are the directories searched when you type command
, so put it in one of those.
Edit: Apparently don’t use /usr/bin
, use /usr/local/bin