如何不使用 python 子进程转义与号

How not to escape an ampersand with python subprocess

我想用 subprocess.Popen() 执行此命令,其中包含一个将被解释为批处理连接运算符的符号:

COMMAND="c:\p\a.exe & python run.py"
subprocess.Popen(COMMAND,cwd=wd,shell=False)`

然而,符号 & 被解释为 a.exe 的参数,而不是批处理运算符。

解决方案 1: 看到相关的 question 后,一个解决方案可能是设置 shell=True 但会出现错误 'UNC path are not supported',因为我的工作目录是远程的。此解决方案无法正常工作。

解决方案 2: 可执行文件 a.exe 应该使用 -inputDir 参数来指定文件的远程位置并使用本地工作目录。我认为这个解决方案可行,但我可能没有可执行文件的源代码。

解决方案 3: 我可以将 c:\p\a.exe & python run.py 写入 command.bat 然后使用

COMMAND="c:\p\command.bat"
subprocess.Popen(COMMAND,cwd=wd,shell=False)`

这种方法行得通吗?

解决方案 4: 我正在尝试解决此问题,仅更改 subprocess.Popen() 调用。有可能做到吗?基于 python Popen doc 我怀疑是不可能的。请告诉我我错了。

另请参阅this 相关问题。

更新:

解决方案 5:@mata 建议使用 Powershell Popen(['powershell', '-Command', r'C:\p\a.exe; python run.py'])。这确实有效,但现在我必须处理略有不同的命令,并且懒惰我决定使用解决方案 3。

我最喜欢的解决方案是解决方案 3,创建一个 .bat 文件并将其命名为

COMMAND="c:\p\command.bat"
subprocess.Popen(COMMAND,cwd=wd,shell=False)

我会用Solution 3

The & character is used to separate multiple commands on one command line. 
Cmd.exe runs the first command, and then the second command.

在这种情况下,您可以像这样编写批处理文件:

@echo off
c:\p\a.exe
python run.py

此外,使用cmd.exe时值得注意:

The ampersand (&), pipe (|), and parentheses ( ) are special characters
that must be preceded by the escape character (^) or quotation marks
when you pass them as arguments.