在python的子进程中使用撇号

2024-10-01 02:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

似乎我不能使用撇号,命令失败,没有提示性错误。 我正在尝试执行以下操作:

    secretLsCmd      = subprocess.Popen(('docker', 'secret', 'ls')     , stdout=subprocess.PIPE)
    oneWhitespaceCmd = subprocess.Popen(('tr', '-s','" "')             , stdout=subprocess.PIPE, stdin=secretLsCmd.stdout)
    onlySecretsCmd   = subprocess.check_output(('cut', "-d' '", '-f2') , stdin=oneWhitespaceCmd.stdout)

在普通Linux终端中,它将执行以下命令:

^{pr2}$

在CLI中运行这个命令可以正常工作,但是一旦我把它放到python中,它就不能工作了。管道中的前两个命令工作正常(我检查过了),最后一个命令不工作,退出时出现错误代码1。。。我几乎百分之百地肯定是-d'',但我该怎么解决呢?有什么想法吗?在


Tags: docker命令secret错误stdinstdoutlstr
1条回答
网友
1楼 · 发布于 2024-10-01 02:34:31

这条线:

oneWhitespaceCmd = subprocess.Popen(('tr', '-s','" "'), ...)

正在运行:

^{pr2}$

因此,您希望丢失额外的双引号:Python将引用它需要为shell引用的任何参数。在

此命令:

onlySecretsCmd   = subprocess.check_output(('cut', "-d' '", '-f2'), ...)

相当于shell命令:

cut '-d'"'"' '"'"'' -f2

因此,您可能只想丢失空白处的引号:

onlySecretsCmd   = subprocess.check_output(('cut', "-d ", '-f2'), ...)

让Python在需要的地方插入引号。这将实际运行(应该与您想要的相同,但不完全相同):

cut '-d ' -f2

我使用shlex.quote()创建了一个与您正在运行的命令等价的shell,但是在实践中,除非您告诉subprocess调用shell,否则它将执行bash解析所有转义引号后执行的命令的等效命令。所以在内部,转义并没有发生,但也不需要引用来区分参数。在

相关问题 更多 >