微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带撇号的 Python 子进程,删除它们

如何解决带撇号的 Python 子进程,删除它们

我正在从 subprocess.run 函数向我的容器化 Hbase 数据库运行命令:

subprocess.run(('docker exec hbase bash -c "echo -e create "myTable","R" | hbase shell"'),shell=True)

该命令似乎按我的预期运行,它打开 HBase shell,然后尝试执行下一个命令但没有撇号:create myTable,R

我得到的错误

2021-06-01 05:23:18,587 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference,please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.2.4,r67779d1a325a4f78a468af3339e73bf075888bac,2020年 03月 11日 星期三 12:57:39 CST
Took 0.0032 seconds
stty: 'standard input': Inappropriate ioctl for device
create myTable,R
NameError: undefined local variable or method `myTable' for main:Object

HBase 期望 myTableR 周围有撇号。 我尝试运行相同的命令,在撇号前加上

subprocess.run(('docker exec hbase bash -c "echo -e create \"myTable\",\"R\" | hbase shell"'),shell=True)

但我得到了相同的结果。

知道如何防止它删除撇号吗? 提前致谢!

解决方法

你不能像那样嵌套双引号。假设我们能正确猜出你想说什么,试试

subprocess.run([
    'docker','exec','hbase','bash','-c','''echo 'create "myTable","R"' | hbase shell'''])

这也方便地摆脱了 pesky shell=True。 (我还从 -e 中取出了 echo -e,它似乎没有贡献任何有用的东西。无论如何,如果您确实需要该功能,可能更喜欢 printf。)

Python 专门提供了三引号,以便您可以根据需要在字符串中同时传入单引号和双引号。 shell 接受字符串周围的单引号或双引号(尽管它们的语义略有不同——单引号完全逐字引用,而双引号稍微弱一些),因此我们在 echo 的参数周围使用这些引号。不引用参数会导致 bash 解析并删除引号。 (在 shell 本身中,您可以等效地在双引号内说 echo "create \"myTable\",\"R\"",文字双引号被转义;但是通过两个额外的反斜杠引用层来获得它会变得丑陋。Python 和 bash -c想用那些反斜杠做事。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。