在Python 2.5中使用Python 2.6子进程模块

时间:2009-02-16 06:41:56

标签: python subprocess python-2.5

我想使用Python 2.6的子进程版本,因为它允许Popen.terminate()函数,但我坚持使用Python 2.5。在我的2.5代码中使用较新版本的模块是否有一些相当干净的方法?某种from __future__ import subprocess_module

6 个答案:

答案 0 :(得分:9)

我知道这个问题已经得到了回答,但是对于它的价值,我已经在Python 2.3中使用了Python 2.6附带的subprocess.py并且它运行良好。如果您阅读文件顶部的注释,则说明:

  

# This module should remain compatible with Python 2.2, see PEP 291.

答案 1 :(得分:6)

实际上并没有很好的方法。 subprocess是implemented in python(而不是C),所以你可以想象在某处复制模块并使用它(当然希望它不使用任何2.6优点)。

另一方面,您可以简单地实现子进程声明要执行的操作,并编写一个在* nix上发送SIGTERM并在Windows上调用TerminateProcess的函数。以下实现已在Linux和Win XP vm中测试过,您需要python Windows extensions

import sys

def terminate(process):
    """
    Kills a process, useful on 2.5 where subprocess.Popens don't have a 
    terminate method.


    Used here because we're stuck on 2.5 and don't have Popen.terminate 
    goodness.
    """

    def terminate_win(process):
        import win32process
        return win32process.TerminateProcess(process._handle, -1)

    def terminate_nix(process):
        import os
        import signal
        return os.kill(process.pid, signal.SIGTERM)

    terminate_default = terminate_nix

    handlers = {
        "win32": terminate_win, 
        "linux2": terminate_nix
    }

    return handlers.get(sys.platform, terminate_default)(process)

这样你只需要维护terminate代码而不是整个模块。

答案 2 :(得分:2)

虽然这不能直接回答你的问题,但可能值得了解。

来自__future__的导入实际上只改变编译器选项,因此虽然它可以转换为语句或使字符串文字生成unicode而不是strs,但它不能改变Python标准中模块的功能和特性库。

答案 3 :(得分:2)

我遵循了Kamil Kisiel关于在python 2.5中使用python 2.6 subprocess.py的建议,它运行得很好。为了方便起见,我创建了一个distutils包,您可以轻松地安装和/或包含在buildout中。

在python 2.5项目中使用python 2.6的子进程:

easy_install taras.python26

代码

from taras.python26 import subprocess
在buildout中

[buildout]
parts = subprocess26

[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26

答案 4 :(得分:1)

以下是一些在Windows上结束进程的方法,直接来自 http://code.activestate.com/recipes/347462/

# Create a process that won't end on its own
import subprocess
process = subprocess.Popen(['python.exe', '-c', 'while 1: pass'])


# Kill the process using pywin32
import win32api
win32api.TerminateProcess(int(process._handle), -1)


# Kill the process using ctypes
import ctypes
ctypes.windll.kernel32.TerminateProcess(int(process._handle), -1)


# Kill the proces using pywin32 and pid
import win32api
PROCESS_TERMINATE = 1
handle = win32api.OpenProcess(PROCESS_TERMINATE, False, process.pid)
win32api.TerminateProcess(handle, -1)
win32api.CloseHandle(handle)


# Kill the proces using ctypes and pid
import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, process.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)

答案 5 :(得分:0)

Python是开源的,您可以自由地从2.6中获取该pthread函数并将其移动到您自己的代码中,或者将其用作实现您自己的代码的参考。

由于显而易见的原因,无法使用可以导入部分新版本的Python混合。