在 Windows 的 Python 子进程中转义引号

问题描述 投票:0回答:1

我正在尝试终止一个单独使用多个线程的 Python 程序。

如果我没记错的话,只需

sys.exit()
就可以了。

但是,为了防止我犯许多错误,包括丢失对线程的引用,我尝试了以下方法:

subprocess.Popen(['start', 'cmd.exe', '/c', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我认为这是转义引号的问题,所以我尝试了几种方法但失败了。我放弃了并执行了以下操作,效果非常好。

with open('exit_self.bat', 'w') as file:
  file.write(f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"&del exit_self.bat')
subprocess.Popen(['start', 'cmd.exe', '/c', 'exit_self.bat'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

没有临时文件怎么办?我错过了什么?作为参考,我使用

/k
代替
/c
cmd.exe
选项离开窗口并检查窗口中的错误消息,如下:

Waiting for 0 seconds, press a key to continue ...
ERROR: Invalid argument/option - 'eq'.
Type "TASKKILL /?" for usage.

我不确定它是否有帮助,但我添加了

echo
来查看正在执行的命令的语法:

subprocess.Popen(['start', 'cmd.exe', '/k', 'echo', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

结果是:

"timeout 5&taskkill /f /fi \"PID eq 3988\""
python windows batch-file subprocess
1个回答
0
投票

来自

subprocess.Popen
::

args 应该是程序参数的序列,或者是单个字符串或类似路径的对象。

我运行了 notepad.exe,记下它的 PID (3840) 并使用了单个字符串。 请注意,使用

shell=True
,您不需要
start cmd.exe /c
:

import subprocess

p = subprocess.Popen('timeout 5&taskkill /f /fi "PID eq 3840"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = p.communicate()
print(x)

输出(记事本被杀):

(b'\r\nWaiting for 5 seconds, press a key to continue ...\x084\x083\x082\x081\x080\r\nSUCCESS: The process with PID 3840 has been terminated.\r\n', b'')
© www.soinside.com 2019 - 2024. All rights reserved.