Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run a script using full path

I have a folder called TEST with inside :

  • script.py
  • script.sh

The bash file is :

#!/bin/bash

# Run the python script
python script.py

If I run the bash file like this :

./TEST/script.sh

I have the following error :

python: can't open file 'script.py': [Errno 2] No such file or directory

How could I do, to tell my script.sh to look in the directory (which may change) and to allow me to run it for inside the TEST directory ?

Tricky, my python file run a sqlite database and I have the same problem when calling the script from outside the folder, it didn't look inside the folder to find the database!


2 Answers

Alternative

You are able to run the script directly by adding this line to the top of your python file:

#!/usr/bin/env python

and then making the file executable:

$ chmod +x script.py

With this, you can run the script directly with ./TEST/script.py

What you asked for specifically

This works to get the path of the script, and then pass that to python.

#!/bin/sh

SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
python "$SCRIPTPATH/script.py"

Also potentially useful:

You mentioned having this problem with accessing a sqlite DB in the same folder, if you are running this from a script to solve this problem, it will not work. I imagine this question may be of use to you for that problem: How do I get the path of a the Python script I am running in?

like image 50
Marcus Avatar answered Aug 09 '26 18:08

Marcus


You could use $0 which is the name of the currently executing program, as invoked, combined with dirname which provides the directory component of a file path, to determine the path (absolute or relative) that the shell script was invoked under. Then, you can apply it to the python invocation.

This example worked for me:

$ t/t.sh
Hello, world!    
$ cat t/t.sh
#!/bin/bash
python "$(dirname $0)/t.py"

Take it a step farther and change your current working directory which will also be inherited by python, thus helping it to find its database:

$ t/t.sh; cat t/t.sh ; cat t/t.py ; cat t/message.txt
hello, world!

#!/bin/bash
cd "$(dirname $0)"
python t.py
with(open('message.txt')) as msgf:
  print(msgf.read())
hello, world!
like image 26
Daniel Farrell Avatar answered Aug 09 '26 17:08

Daniel Farrell



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!