我有一个脚本,我在其中使用subprocess.Popen来启动一个外部程序和process.kill()以便在它启动时立即杀死它。每次脚本试图杀死它时,我都会收到Windows错误[5](拒绝访问)。我意识到程序的pid在打开后实际上正在发生变化。有没有办法在Python中监视更改的过程,或只是检索新的pid?
以下是代码:
import subprocess
import time
proc = subprocess.Popen(Path/to/WinSCP.exe)
time.sleep(2)
proc.kill()
错误:
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "C:\Path", line 231, in __call__
self.scpsetup()
File "C:\Path", line 329, in scpsetup
proc.kill()
File "C:\Python27\lib\subprocess.py", line 1019, in terminate
_subprocess.TerminateProcess(self._handle, 1)
WindowsError: [Error 5] Access is denied
答案 0 :(得分:2)
这就是我最终要做的事情;
import tempfile
import subprocess
import time
# Create a temp file to receive output
tf = tempfile.NamedTemporaryFile(delete=False)
output = open(tf.name, "w")
# Open and close WinSCP
subprocess.Popen(Path/To/WinSCP.exe)
time.sleep(2)
subprocess.call("TASKKILL /IM WinSCP.exe", stdout=output)
tf.close()
我之前使用过这样的方法的问题是我无法隐藏命令的输出。这可能不是实现这一目标最漂亮的方法,但它确实有效。
另请注意,我使用的是Windows 8.我了解在不同版本的Windows中,命令本身可能略有不同。