我需要一个python脚本来在windows上调用bash脚本。 所以基本上我必须通过python创建一个子进程调用,它将使用-c选项调用cygwin,该选项将调用我需要的脚本, 问题是这个脚本需要一些参数,并且这些参数是完整的os空格和引号和斜杠。 我使用的代码如下
//instead of
sc.useDelimiter(Pattern.compile("(, ) | (\r\n)"));
//it should be this
sc.useDelimiter(Pattern.compile("(, )|(\r\n)"));
或者我直接转义,这有时会让我连续多达8个反斜杠,因为必须转发到我的脚本的反斜杠i)在bash ii)cmd.exe中iii)in蟒
所有这些都容易出错,每次都需要花费很长时间才能做到正确。
有更好的方法吗?理想情况下,我不会有任何转义反斜杠,但任何避免上述三斜杠双引号的东西都会很好。
我尝试使用re.escape,但可以弄清楚如何使用它,除了作为替换.replace(" \"," /")和类似。
答案 0 :(得分:2)
不要将单个字符串传递给call
;相反,传递一个由命令名称和每个元素一个参数组成的列表。这使您无需保护shell解释中的特殊字符。
subprocess.call(["retirarVirgula.sh", arq_saida], executable=r"C:\cygwin64\bin\bash")
注意:我假设arq_saida
包含传递给脚本的单个参数;如果脚本有多个参数,那么arc_saida
也可能被构建为一个列表:
arq_saida = ["arg", "arg two", "arg three"]
subprocess.call(["retirarVirgula.sh"] + arq_saida, executable=r"C:\cygwin64\bin\bash")