user318904
user318904

Reputation: 3066

Mixed shell and python script possible?

I swear I have seen this done before but can not find it now. Is it possible to have a shell script start a python interpeter "mid stream", ie:

#!/bin/bash
#shell stuff..

set +e

VAR=aabb

for i in a b c; do
    echo $i
done

# same file!

#!/usr/bin/env python
# python would be given this fd which has been seek'd to this point

import sys

print ("xyzzy")

sys.exit(0)

Upvotes: 7

Views: 6840

Answers (5)

ruakh
ruakh

Reputation: 183211

You could write

exec python <<END_OF_PYTHON

import sys

print ("xyzzy")

sys.exit(0)
END_OF_PYTHON

to replace the Bash process with Python and pass the specified program to Python on its standard input. (The exec replaces the Bash process. The <<END_OF_PYTHON causes standard input to contain everything up till END_OF_PYTHON.)

Upvotes: 2

Yauhen Yakimovich
Yauhen Yakimovich

Reputation: 14211

I agree that mixing/mashing up can be quite a powerful technique - not only in scripting but also in command line (e.g. perl inliners have been proven to be very successful over time). So my small tip on another variation of one-liners (in addition to mentioned by kev) for mixed scripting in bash/python:

for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done;

produces

x
y
z

Upvotes: 0

piokuc
piokuc

Reputation: 26164

You can use this shell syntax (it is called here document in Unix literature):

#!/bin/sh
echo this is a shell script

python <<@@
print 'hello from Python!'
@@

The marker after '<<' operator can by an arbitrary identifier, people often use something like EOF (end of file) or EOD (end of document). If the marker starts a line then the shell interprets it as end of input for the program.

Upvotes: 9

kev
kev

Reputation: 161604

If your python script is very short. You can pass it as a string to python using the -c option:

python -c 'import sys; print "xyzzy"; sys.exit(0)'

Or

python -c '
import sys
print("xyzzy")
sys.exit(0)
'

Upvotes: 3

user318904
user318904

Reputation: 3066

Of course right after I posted this I remembered a way to do it:

#!/bin/sh

echo Shell

python <<EOF

import sys

print "Python"

sys.exit(0)

EOF

Upvotes: 0

Related Questions