Search code examples
pythonbashjupyter-notebookipythoncommand-line-arguments

Passing IPython variables as arguments to bash commands


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)


Solution

  • 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