Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以编程方式转义引号和斜杠_Python_Escaping - Fatal编程技术网

Python 如何以编程方式转义引号和斜杠

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_

我需要一个python脚本来调用windows上的bash脚本。 所以基本上我必须从python中调用一个子流程,它将使用-c选项调用cygwin,该选项将调用我需要的脚本, 问题是这个脚本需要几个参数,这些参数是完整的os空格、引号和斜杠。 我使用的代码如下

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