将 Ipython 变量作为字符串参数传递给 shell 命令

Passing Ipython variables as string arguments to shell command

如何从 Ipython/Jupyter notebook 执行 shell 命令,将 python 字符串变量的值作为字符串传递到 bash 参数中,如本例所示:

sp_name = 'littleGuy' #the variable

sp_details = !az ad app list --filter "DisplayName eq '$sp_name'" #the shell command

我试过单独使用 $sp_name${sp_name}{sp_name} 等,如 中所述,但 none 有效。

这里的关键是变量名需要在 shell 命令中作为字符串引用。

编辑1:

@manu190466。我从字符串输出判断您的解决方案有效。由于某种原因,它似乎在实践中没有。我想知道 az ad app list URL 是否对查询或其他内容进行编码...?

想法?

你会尝试这样的事情吗:

sp_name = 'littleGuy' #the variable
sp_query = "DisplayName eq "+sp_name 

sp_details = !az ad app list --filter {sp_query}

您遇到的主要问题似乎来自您的字符串中所需的引号。 您可以使用格式指令和原始字符串将引号保留在字符串中。

在整个字符串前使用 'r' 表示将其作为原始字符串读取,即:必须不解释特殊字符。在你的情况下,原始字符串不是严格要求的,因为 python 的字符串构造函数能够在双引号声明中保留单引号,但我认为当其中有非字母数字时使用原始字符串声明符是一个好习惯.

至少有两种格式化字符串的方法:

继承自带有 % 符号的古代语言的旧方法:

sp_name = 'littleGuy' #the variable
sp_query = r"DisplayName eq '%s'"%(sp_name) 

sp_details = !az ad app list --filter {sp_query}

带有 {} 符号和 format() 方法的新方法:

sp_name = 'littleGuy' #the variable
sp_query = r"DisplayName eq '{}'".format(sp_name) 

sp_details = !az ad app list --filter {sp_query}

这个问题也可以用下面的方式解决

sp_name = 'littleGuy' #the variable
sp_details = !az ad app list --filter "DisplayName eq '{sp_name}'"