python - 带有撇号的 Python 子进程,删除它们
问题描述
我正在从subprocess.run
函数向我的容器化 Hbase DB 运行命令:
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
myTable
HBase 期望和周围有撇号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'''])
这也方便地摆脱了讨厌shell=True
的东西。-e
(我还从中取出了echo -e
似乎没有贡献任何有用的东西。printf
无论如何,如果您确实需要该功能,可能会更喜欢。)
Python 专门提供了三引号,以便您可以在需要时在字符串中同时传递单引号和双引号。shell 接受字符串周围的单引号或双引号(尽管它们的语义略有不同 - 单引号完全逐字引用,而双引号则稍弱一些),因此我们在echo
. 不引用参数会导致bash
解析和删除引号。(在 shell 本身中,您可以等效地echo "create \"myTable\", \"R\""
在双引号内说,将文字双引号转义;但是通过两层额外的反斜杠引用来实现这一点会变得很难看。Python 和bash -c
想要用这些反斜杠做事。)
推荐阅读
- blogger - 根据 url 中存在的字符串在页面加载时隐藏博客模板的部分
- python - fastText test_label 将文本分类中所有标签的召回率显示为 nan
- tcl - 这个 tcl 脚本通过创建一个到 ls 的管道来实现什么?
- c++ - 编译带有 .c 扩展名的 CPP 程序
- android - Android Studio - 使用预设的共享首选项部署 apk
- haskell - 我怎样才能获取我的 [[char]] 的第一个元素
- c# - ASP.Net Core `UseAuthorization` 无法识别
- python - CTR模式解密
- php - MySQL Workbench 使用 AES-128-CTR 解密 php 中加密的数据
- sql - 有没有办法找到每列的重复项?