Python subprocess调用docker操作HBase时引号被自动删除如何解决
问题原因
你遇到的引号丢失是多层嵌套的解析环境导致的:代码先后经过Python字符串解析、宿主机shell解析(因为你开启了shell=True)、容器内bash解析三层处理,每层都会吃掉一层转义符、剥离一层引号,你仅加了一层转义,到HBase Shell执行时自然就没有引号了。
解决方案
这里给你三种可行的写法,按稳妥性从高到低排序:
方案1(最推荐):绕开多层shell解析,直接通过标准输入传命令
完全规避多层转义问题,直接把HBase命令写入hbase shell的标准输入:
import subprocess # HBase命令直接写在bytes里,无需多层转义 hbase_cmd = b"create 'myTable', 'R'\n" subprocess.run( ["docker", "exec", "-i", "hbase", "hbase", "shell"], input=hbase_cmd, check=True )
方案2:关闭shell=True,用列表传参避免宿主机shell解析
关闭shell=True后subprocess会直接调用docker命令,不会经过宿主机shell转义,仅需要处理容器内bash的一层转义即可:
import subprocess subprocess.run([ "docker", "exec", "hbase", "bash", "-c", "echo 'create \"myTable\", \"R\"' | hbase shell" ])
方案3:保留shell=True,补全多层转义
如果必须保留shell=True写法,需要补充转义层数,确保经过三层解析后还能保留引号:
import subprocess # 用原始字符串+三层转义确保引号最终保留 subprocess.run( r'docker exec hbase bash -c "echo -e \"create \\\"myTable\\\", \\\"R\\\"\" | hbase shell"', shell=True )
内容的提问来源于stack exchange,提问作者Oded
相关产品推荐
相关产品推荐

