Python 如何以编程方式转义引号和斜杠
我需要一个python脚本来调用windows上的bash脚本。 所以基本上我必须从python中调用一个子流程,它将使用-c选项调用cygwin,该选项将调用我需要的脚本, 问题是这个脚本需要几个参数,这些参数是完整的os空格、引号和斜杠。 我使用的代码如下Python 如何以编程方式转义引号和斜杠,python,escaping,Python,Escaping,我需要一个python脚本来调用windows上的bash脚本。 所以基本上我必须从python中调用一个子流程,它将使用-c选项调用cygwin,该选项将调用我需要的脚本, 问题是这个脚本需要几个参数,这些参数是完整的os空格、引号和斜杠。 我使用的代码如下 arq_saida_unix = arq_saida.replace("\\","/") subprocess.call("C:\\cygwin64\\bin\\bash \".\\retirarVirgula.sh\\ \""+arq_
arq_saida_unix = arq_saida.replace("\\","/")
subprocess.call("C:\\cygwin64\\bin\\bash \".\\retirarVirgula.sh\\ \""+arq_saida+"\"")
或者我直接转义,有时一行最多需要8个反斜杠,为了让反斜杠进入我的脚本,必须在bash ii)在cmd.exe iii)在python中转义
所有这些都是容易出错的,每次都要花相当多的时间才能正确完成
有更好的方法吗?理想情况下,我不会有任何转义反斜杠,但任何避免上面三斜杠双引号的东西都会很好
我试图使用re.escape,但我知道如何准确地使用它,除了作为.replace(“\”、“/”)和类似内容的替换之外。不要将一个字符串传递给
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")
我通常看到
子流程。调用,将可执行文件作为列表中的第一个元素,而不是作为单独的可执行文件
关键字参数-有什么区别吗?在这种情况下,差别不大。我更喜欢使用它来移动bash
,这样您就可以专注于运行带有参数的脚本,而不是将脚本及其参数都作为参数传递给bash
。这听起来很合理。然而,在我的机器上,执行subprocess.call([“foo.sh”],executable=“/bin/bash”)
似乎会启动bash(可能是foo.sh的argv[0]),但不会启动foo.sh本身。感谢您对使用列表作为参数的评论,但我担心问题远没有解决。我的代码只是一个不起作用的例子。实际上,On必须使用-c参数,因此必须将绑定retiravigula.sh和arg的引号放在一起,以便所有内容都传递给bash,arg本身需要转义,因为它们包含字符串,很难知道转义了多少次。啊,我误解了可执行文件的工作原理。不过,您应该能够使用['bash','retiravigula.sh','arg1','arg2']
而不是使用-c
。