将 IPython 变量作为参数传递给 bash 命令
Posted
技术标签:
【中文标题】将 IPython 变量作为参数传递给 bash 命令【英文标题】:Passing IPython variables as arguments to bash commands 【发布时间】:2016-05-31 12:57:40 【问题描述】:如何从 Ipython/Jupyter 笔记本执行 bash 命令,将 python 变量的值作为参数传递,如下例所示:
py_var="foo"
!grep py_var bar.txt
(显然我想用 grep 搜索 foo
而不是文字字符串 py_var
)
【问题讨论】:
How to pass command line arguments to ipython的可能重复 @AmrithKrishna:不是这样。查看编辑。 后续:我想使用关键字参数,例如ffmpeg -i <inputfilename> ...
,但不知何故,下面的答案不适用于这样的命令。您知道替代解决方案吗?
@Aalok:编辑后的答案怎么样?请你现在检查一下。如果它不起作用,请发布您尝试运行的整个命令。
【参考方案1】:
在您的变量名称前加上$
。
示例
假设您要将文件file1
复制到存储在名为dir_pth
的python 变量中的路径:
dir_path = "/home/foo/bar"
!cp file1 $dir_path
来自 Ipython 或 Jupyter 笔记本
编辑
感谢 Catbuilts 的建议,如果您想连接多个字符串以形成路径,请使用 ..
而不是 $..$
。
在这两种情况下都适用的一般解决方案是坚持使用..
dir_path = "/home/foo/bar"
!cp file1 dir_path
如果你想将另一个字符串sub_dir
连接到你的路径,那么:
!cp file1 dir_path + sub_dir
编辑 2
有关使用原始字符串(以r
为前缀)传递变量的相关讨论,请参阅Passing Ipython variables as string arguments to shell command
【讨论】:
不要忘记将您自己的答案标记为已接受的答案;-) 它有助于在 *** 上保持“干净”。 虽然!cp file1 $dir_path
和!cp file1 dir_path
有相似的结果,但我发现使用$
有点冒险,因为使用
,你可以连接一个路径,比如!cp file1 folder + dir_path
,而!cp file1 $folder + $dir_path
删除所有folder
文件。小心。
如果变量中有空格,别忘了加引号!。例如,如果它是 thisdir_path = "/home dir/foo/bar"
,请使用如下引号:!cp file1 "$dir_path"
。这会在 bash 命令中添加引号。
当 IPython 变量是插入到 shell 字符串中的字符串时,执行此操作的方法如下:***.com/questions/35497069/…
供 Colab 用户参考:variable
表示法与 Google Colab 笔记本的工作方式不同。如果您的 python variable
包含空格或任何破坏 cmd 行命令的内容,您仍然需要将其括在引号中。所以!cp file1 "dir_path"
。添加多个变量的值确实有效 - 但如果它可能有空格,则需要引号:!cp "filename + filename" "/content/drive/My Drive/"
【参考方案2】:
你也可以使用这个语法:
path = "../_data/"
filename = "titanicdata.htm"
! less path + filename
【讨论】:
优秀。谢谢!【参考方案3】:正如@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
【讨论】:
没有简单的解决方案可以在一个命令中同时使用 Python 和环境变量。作为一种解决方法,我们可以创建一个字符串变量,如下所示:command = f"echo $PWD/afile" !command
以上是关于将 IPython 变量作为参数传递给 bash 命令的主要内容,如果未能解决你的问题,请参考以下文章
如何将文件路径作为 bash 脚本中的参数传递给函数? [复制]
TCL/Expect 相当于 Bash $@ 或如何将参数传递给 TCL/Expect 中的衍生进程