将 IPython 变量作为参数传递给 bash 命令

如何执行来自 Ipython/Jupiter 笔记本的 bash 命令,将 python 变量的值作为参数传递,如下例所示:

py_var="foo"
!grep py_var bar.txt

(显然我想要的是用于 foo的 grep,而不是字符串 py_var)

56305 次浏览

$作为 变量名称的前缀。

例子

假设您想将一个文件 file1复制到一个存储在名为 dir_pth的 python 变量中的路径:

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

来自 Ipython 或 Jupiter 笔记本

剪辑

感谢 Catbuilts 的建议,如果你想连接多个字符串形成路径,使用 {..}而不是 $..$。 在这两种情况下都有效的一般解决方案是坚持使用 {..}

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

如果您想将另一个字符串 sub_dir连接到您的路径,那么:

!cp file1 {dir_path + sub_dir}

编辑2

有关使用原始字符串(前缀为 r)传递变量的相关讨论,请参见 将 Ipython 变量作为字符串参数传递给 shell 命令

你也可以使用这种语法:

path = "../_data/"
filename = "titanicdata.htm"
! less {path + filename}

正如@Catbuilts 指出的,$是有问题的。为了使它更加明确,而不是掩盖关键的例子,请尝试以下方法:

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

你会得到:

afile.txt
/Users/user/Documents/adir
/Users/user/Documents/adir/{afile}
/Users/user/Documents/adir/afile.txt

只是个附加条件。在我的例子中,正如这个问题中的一些示例所示,我的参数是带空格的文件名。是这种情况下,我不得不使用略有不同的语法: "$VAR"。举个例子

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"

我希望这有所帮助