xxxxxxxxxx
*2 Example of the dangers of temp files. DO NOT USE THIS CODE
cat >/tmp/python-script <<END
for i in range(10):
print(i)
END
python /tmp/python-script
If someone else creates /tmp/python-script first, this shell script won't even stop if it fails to overwrite the file. A malicious user on the system could make a harmful Python script which will run instead of the intended script.
xxxxxxxxxx
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
xxxxxxxxxx
The simplest approach is to just save the python script as, for example script.py and then either call it from the bash script, or call it after the bash script:
#!/usr/bin/env bash
echo "This is the bash script" &&
/path/to/script.py
Or
script.sh && script.py
xxxxxxxxxx
import subprocess
# Replace 'script.sh' with the actual name/path of your bash script
script_path = '/path/to/script.sh'
# Run the bash script
result = subprocess.run(['bash', script_path], capture_output=True, text=True)
# Print the output of the script
print(result.stdout)
xxxxxxxxxx
#/bin/bash
#append python script to file
tee .tempfile.py >/dev/null <<EOF
#!/bin/env python3
from scipy import integrate
x2 = lambda x: x**2
print(integrate.quad(x2, 0, 4))
EOF
#execute using python
python3 .tempfile.py
#remove file after exectution
rm -rf .tempfile.py
xxxxxxxxxx
#!/bin/bash
python3
print("Hello World")
exit()
echo "The execution is completed"
xxxxxxxxxx
You can use heredoc if you want to keep the source of both bash and python scripts together. For example, say the following are the contents of a file called pyinbash.sh:
#!/bin/bash
echo "Executing a bash statement"
export bashvar=100
cat << EOF > pyscript.py
#!/usr/bin/python
import subprocess
print 'Hello python'
subprocess.call(["echo","$bashvar"])
EOF
chmod 755 pyscript.py
./pyscript.py
Now running the pyinbash.sh will yield:
$ chmod 755 pyinbash.sh
$ ./pyinbash.sh
Exe
xxxxxxxxxx
#!/bin/bash
PYCMD=$(cat <<EOF
from datetime import datetime
first_day_of_new_year = datetime(2022, 1, 1)
days_remaining = (first_day_of_new_year - datetime.now()).days
print('{} days remaining in this year'.format(days_remaining))
EOF
)
python3 -c "$PYCMD"