代码之家  ›  专栏  ›  技术社区  ›  xyz

在Python2.5中使用Python2.6子流程模块

  •  10
  • xyz  · 技术社区  · 16 年前

    我想使用Python2.6版本的subprocess,因为它允许 Popen.terminate() 函数,但我仍然坚持使用Python 2.5。在我的2.5代码中,是否有一些合理干净的方法来使用较新版本的模块?某种程度上 from __future__ import subprocess_module ?

    6 回复  |  直到 11 年前
        1
  •  9
  •   Kamil Kisiel    16 年前

    我知道这个问题已经得到了回答,但无论如何,我用了 subprocess.py 这是Python2.3中的Python2.6附带的,并且运行良好。如果您阅读文件顶部的注释,它会显示:

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

        2
  •  6
  •   Aaron Maenpaa    16 年前

    其实没有什么好办法。子流程是 implemented in python (与C相反)因此您可以想象将模块复制到某个地方并使用它(当然希望它不会使用任何2.6版本)。

    另一方面,您可以简单地实现subprocess声称要做的事情,并编写一个函数,在*nix上发送SIGTERM,在Windows上调用TerminateProcess。以下实现已经在linux和WinXP虚拟机上进行了测试,您需要 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 代码,而不是整个模块。

        3
  •  2
  •   Ignacio Vazquez-Abrams    16 年前

    虽然这并不能直接回答你的问题,但它可能值得知道。

    进口自 __future__ 实际上,它只更改编译器选项,因此虽然它可以将with转换为语句或使字符串文本生成Unicode而不是str,但它不能更改Python标准库中模块的功能和特性。

        4
  •  2
  •   Taras Mankovski    15 年前

    我遵循了Kamil Kisiel关于在Python2.5中使用Python2.6 subprocess.py的建议,效果非常好。为了简化,我创建了一个distutils包,您可以轻松安装和/或将其包含在构建中。

    要在python 2.5项目中使用python 2.6中的子流程,请执行以下操作:

    easy_install taras.python26
    

    from taras.python26 import subprocess
    

    内建

    [buildout]
    parts = subprocess26
    
    [subprocess26]
    recipe = zc.recipe.egg
    eggs = taras.python26
    
        5
  •  1
  •       16 年前

    下面是一些在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)
    
        6
  •  0
  •   Andrew Grant    16 年前

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