Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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_Terminate - Fatal编程技术网

python中终止进程的跨平台方法

python中终止进程的跨平台方法,python,terminate,Python,Terminate,当我尝试使用subprocess.Popen.terminate()或kill()命令在windows中终止进程时,会出现访问被拒绝错误。如果文件不再存在,我真的需要一种跨平台的方式来终止进程(是的,我知道这不是我正在做的最优雅的方式),如果可能的话,我不想使用平台调用或导入win32api 另外,一旦我结束了任务,我应该能够删除库中该部分的迭代,不是吗?(我记得我读过一篇文章,说如果我打算在做某件事的同时修改它,就必须使用slice?) 通过执行一些琐碎的操作,您可以轻松地进行与平台无关的调用

当我尝试使用subprocess.Popen.terminate()或kill()命令在windows中终止进程时,会出现访问被拒绝错误。如果文件不再存在,我真的需要一种跨平台的方式来终止进程(是的,我知道这不是我正在做的最优雅的方式),如果可能的话,我不想使用平台调用或导入win32api

另外,一旦我结束了任务,我应该能够删除库中该部分的迭代,不是吗?(我记得我读过一篇文章,说如果我打算在做某件事的同时修改它,就必须使用slice?)


通过执行一些琐碎的操作,您可以轻松地进行与平台无关的调用,如:

try:
    import win32
    def kill(param):
        # the code from S.Lotts link
except ImportError:
    def kill(param):
        # the unix way

我不知道为什么默认情况下python中不存在这种情况,但在其他领域(如文件更改通知)也存在类似的问题,在这些领域中,创建独立于平台的lib(或者至少是win+mac+linux)并不难。我猜它是开源的,所以你必须自己修复它:P

“如果可能的话,我不想使用平台调用或导入win32api。”文档说这是不可能的。请检查是否有关于此主题的重复问题@洛特:我想他的意思是“显式调用win32 API”,在这种情况下,Popen.terminate将在Windows上间接调用它,而在Linux上它将使用Posix。你提到的链接看起来不像是同一个问题。@ThantiK:我认为你在Windows上出现的错误是因为你指定了
shell=True
,你真的需要它吗?如果您切换到
shell=False
,请不要忘记,为了在Linux上正确运行,您必须以进程名作为第一个参数在列表中指定参数。是的,在这种情况下,我必须使用shell=True。我正在调用shell中的函数的程序。一旦我将其设置为false,我就会收到关于子进程在init等上失败的各种错误。@redglyph-在windows上调用Popen.terminate()会给我一个拒绝访问的错误。看起来命令已经实现了,只是不是我所期望的那样。(顺便说一句,这是在Windows XP上)是的,这实际上也让我有点困惑。在win/linux/OSX中确实应该有一种通过传递PID来终止进程的标准方法。无论如何,对于Windows来说,这种方法的风险在于它将终止shell而不是子进程,除非stdin/out/err突然缺少控制台使其崩溃——这正是我在系统上观察到的情况。这意味着子进程将切换到根资源管理器作为父进程而不是shell,并且可能仍然会消耗和阻塞资源。结论:如果必须终止进程,请不要使用
shell=True
。同样,我在这件事上没有选择。如果没有控制台,我正在运行的可执行文件无法运行。如果我将shell设置为false,就会出现各种python错误,比如_init没有正确发生,etc
import win32
对我不起作用。如果os.name==“nt”,我必须使用

try:
    import win32
    def kill(param):
        # the code from S.Lotts link
except ImportError:
    def kill(param):
        # the unix way