Passing IPython variables as arguments to bash commands

Question:

How do I execute a bash command from Ipython/Jupyter notebook passing the value of a python variable as an argument like in this example:

py_var="foo"
!grep py_var bar.txt

(obviously I want to grep for foo and not the literal string py_var)

Asked By: Unni

||

Answers:

General solution

As suggested by Catbuilts, use {..}:

dir_path = "/home/foo/bar"
!cp file1 {dir_path}

Its behaviour is more predictable than $... E.g. if you want to concatenate another string sub_dir to your path, $ wouldn’t give the expected result, while with {..} you can do:

!cp file1 {dir_path + sub_dir}

Initial (edited) answer

For simple cases, you can prefix your variable names with a $.

Example

Say you want to copy a file file1 to a path stored in a python variable named dir_pth:

dir_path = "/home/foo/bar"
!cp file1 $dir_path

from Ipython or Jupyter notebook

As mentioned above, note that it may lead to unexpected results depending on the content of your variables and the way you associate them, hence the general solution should be preferred.

Raw strings

For a related discussion on the use of raw strings (prefixed with r) to pass the variables, see Passing Ipython variables as string arguments to shell command

Answered By: Unni

You cans use this syntax too:

path = "../_data/"
filename = "titanicdata.htm"
! less {path + filename}
Answered By: sloik

As @Catbuilts points out, $‘s are problematic. To make it more explicit and not bury the key example, try the following:

afile='afile.txt'
!echo afile
!echo $PWD
!echo $PWD/{afile}
!echo {pwd+'/'+afile}

And you get:

afile.txt
/Users/user/Documents/adir
/Users/user/Documents/adir/{afile}
/Users/user/Documents/adir/afile.txt
Answered By: paulperry

Just an addition. In my case, and as shown in some of the examples in this question, my arguments were file names with spaces. Is that case I had to use a slightly different syntax: "$VAR". An example would be

touch "file with spaces.txt"
echo "this is a line" > "file with spaces.txt"
echo "this is another line" >> "file with spaces.txt"
echo "last but not least" >> "file with spaces.txt"
echo "the last line" >> "file with spaces.txt"
cat "file with spaces.txt"

# The variable with spaces such as a file or a path
ARGUMENT="file with spaces.txt"
echo $ARGUMENT

# The following might not work
cat $pwd$ARGUMENT

# But this should work
cat $pwd"$ARGUMENT"

I hope this helps. 😉

Answered By: eliasmaxil