Python 带撇号的子进程,删除它们
Python subprocess with apostrophes, removes them
我正在 运行从 subprocess.run
函数向我的容器化 Hbase 数据库发送命令:
subprocess.run(('docker exec hbase bash -c "echo -e create "myTable", "R" | hbase shell"'), shell=True)
似乎命令 运行s 如我所料,它打开 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 期望在 myTable
和 R
周围使用撇号。
我尝试 运行 相同的命令,在撇号前加上 :
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
。 (我还从 echo -e
中删除了 -e
,它似乎没有提供任何有用的东西。无论如何,如果你确实需要该功能,可能更喜欢 printf
。)
Python 专门提供了三重引号,以便您可以在需要时在字符串中同时传递单引号和双引号。 shell 接受字符串周围的单引号或双引号(尽管它们的语义略有不同——单引号完全逐字引用,而双引号稍微弱一些)所以我们在参数周围使用那些 echo
.不引用参数会导致 bash
解析并删除引号。 (在 shell 本身,你可以等效地在双引号内说 echo "create \"myTable\", \"R\""
,文字双引号被转义;但是通过另外两层反斜杠引用来获得它会变得丑陋。两者 Python 和 bash -c
想用这些反斜杠做事。)
我正在 运行从 subprocess.run
函数向我的容器化 Hbase 数据库发送命令:
subprocess.run(('docker exec hbase bash -c "echo -e create "myTable", "R" | hbase shell"'), shell=True)
似乎命令 运行s 如我所料,它打开 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 期望在 myTable
和 R
周围使用撇号。
我尝试 运行 相同的命令,在撇号前加上 :
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
。 (我还从 echo -e
中删除了 -e
,它似乎没有提供任何有用的东西。无论如何,如果你确实需要该功能,可能更喜欢 printf
。)
Python 专门提供了三重引号,以便您可以在需要时在字符串中同时传递单引号和双引号。 shell 接受字符串周围的单引号或双引号(尽管它们的语义略有不同——单引号完全逐字引用,而双引号稍微弱一些)所以我们在参数周围使用那些 echo
.不引用参数会导致 bash
解析并删除引号。 (在 shell 本身,你可以等效地在双引号内说 echo "create \"myTable\", \"R\""
,文字双引号被转义;但是通过另外两层反斜杠引用来获得它会变得丑陋。两者 Python 和 bash -c
想用这些反斜杠做事。)