将IPython变量作为字符串参数传递给Shell命令

7
我该如何在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}等,正如此相关问题所述,但都没有成功。

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

编辑1:

@manu190466。从字符串输出来看,你的解决方案有效。但由于某种原因实际上并不起作用。我想知道是否az ad app list对查询进行URL编码之类的操作……?

你有什么想法吗?

enter image description here

3个回答

13

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

在整个字符串前面使用'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_query = r"DisplayName eq '{}'".format(sp_name), sp_query, "DisplayName eq 'python-sp'" - SeaDude
这个在纯IPython shell(CLI,而不是Jupyter notebook)中也应该能工作吗?对我来说似乎没有,但可能是因为我的情况中有一些额外的引号。 - combinatorist

0
问题也可以通过以下方式解决
sp_name = 'littleGuy' #the variable
sp_details = !az ad app list --filter "DisplayName eq '{sp_name}'"

嗯,对于这个问题我仍然收到一个错误提示信息 ERROR: az: error: unrecognized arguments: eq \'littleGuy\'"', - SeaDude
@SeaDude,你能否评论一下在使用Bash终端时你运行了哪个命令? - Tarun Lalwani
当然。sp_name = 'littleGuy' sp_details = !az ad app list --filter \"DisplayName eq \'{sp_name}\'\" sp_details - SeaDude
打开终端并在bash中运行命令,告诉我你运行了什么命令。不使用iPython - Tarun Lalwani
本问题的主题是IPython,也是我唯一的Python环境。在这种情况下,我正在从IPython运行终端命令,没有其他选择。 - SeaDude
好的,你可以尝试一下 !az ad app list --filter "DisplayName eq '{sp_name}'" 吗? - Tarun Lalwani

0
你会尝试这样的方法吗?
sp_name = 'littleGuy' #the variable
sp_query = "DisplayName eq "+sp_name 

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

与之前相同的错误。sp_nameDisplayName eq字符串内需要添加额外的引号。应该是"DisplayName eq 'littleGuy'"sp_name = 'littleGuy' sp_query = "DisplayName eq " + sp_name sp_details = !az ad app list {sp_query} > sp_details2.json sp_details['ERROR: az:error:未识别的参数:DisplayName eq littleGuy',  'usage:az [-h] [--verbose] [--debug]',  '          [--output {json,jsonc,table,tsv,yaml,none}] [--query JMESPATH]',  '          {ad} …'] - SeaDude
如果您在sp_name中添加引号,例如"'littleGuy'",会发生什么? - Ehsan
尝试过 sp_name = "littleGuy"sp_name = "'littleGuy'"sp_name = '"littleGuy"'。但是都得到了相同的错误结果。 - SeaDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接