Bet*_*fEd 5 python quotes subprocess quoting double-quotes
我正在寻找一种将包含双引号的参数传递给python的子进程模块的方法,而不会将双引号转义。
当引号围绕arg时,我已经看到过几次不同的问题,但是答案通常是删除引号。我遇到的问题是引号是参数的一部分,必须传递给脚本,而不必在每个引号前加反斜杠
例:
我正在调用subprocesTest.bat,这是一个简单的批处理脚本,它接受一个参数并回显它:
echo "%~1"
Run Code Online (Sandbox Code Playgroud)
我使用包含引号的arg从python调用批处理脚本:
import subprocess
test_string = 'Bill said "Hi!"'
cmd = ["subprocesTest.bat",
test_string
]
p = subprocess.Popen(cmd)
p.wait()
Run Code Online (Sandbox Code Playgroud)
预期输出:
“比尔说:“嗨!”
实际输出:
“比尔说\“嗨!\”
从命令行调用相同的批处理脚本时,我可以得到预期的输出,如下所示:
subprocesTest.bat“比尔说”嗨!“
查看源代码,subprocess.py的list2cmdline函数记录为:
3) A double quotation mark preceded by a backslash is
interpreted as a literal double quotation mark.
Run Code Online (Sandbox Code Playgroud)
但是,如果我逐步执行此功能,则看不到不加反斜杠就不能传递双引号的方法:
elif c == '"':
# Double backslashes.
result.append('\\' * len(bs_buf)*2)
bs_buf = []
result.append('\\"')
Run Code Online (Sandbox Code Playgroud)
所以我有两个问题...
这是询问此问题的其他线程,并且通过不使用引号来解决:
我实际上想在引数中使用引号的情况下,我看不到任何回应
1) 是的,但可能不适用于 Windows 和/或使用 .bat 文件。例如,当您运行与此等效的 Windows 时会发生什么:
import subprocess
test_string = 'Bill said "Hi!"'
cmd = ["./myprog.py",
test_string
]
p = subprocess.Popen(cmd)
p.wait()
Run Code Online (Sandbox Code Playgroud)
myprog.py:
#!/usr/bin/env python
import sys
print '"{}"'.format(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)
2)好吧,下面的内容似乎有点含糊:
"Bill said "Hi!""
Run Code Online (Sandbox Code Playgroud)
是带引号的字符串吗:
"Bill said "
Run Code Online (Sandbox Code Playgroud)
后跟不带引号的字符串:
Hi!
Run Code Online (Sandbox Code Playgroud)
后跟带引号的空白字符串:
""
Run Code Online (Sandbox Code Playgroud)
?
归档时间: |
|
查看次数: |
7249 次 |
最近记录: |