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
)
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
)
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}
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.
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
You cans use this syntax too:
path = "../_data/"
filename = "titanicdata.htm"
! less {path + filename}
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
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. ;)