Использовать модуль подпроцесса Python 2.6 в Python 2.5 - PullRequest
10 голосов
/ 16 февраля 2009

Я хотел бы использовать версию подпроцесса Python 2.6, потому что он разрешает функцию Popen.terminate () , но я застрял с Python 2.5. Есть ли какой-нибудь достаточно чистый способ использовать более новую версию модуля в моем коде 2.5? Что-то вроде from __future__ import subprocess_module?

Ответы [ 6 ]

9 голосов
/ 17 февраля 2009

Я знаю, что на этот вопрос уже был дан ответ, но для этого я использовал subprocess.py, который поставляется с Python 2.6 в Python 2.3, и он работал нормально. Если вы читаете комментарии вверху файла, там написано:

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

6 голосов
/ 16 февраля 2009

Не очень хороший способ сделать это. Подпроцесс реализован в Python (в отличие от C), так что вы можете скопировать модуль куда-нибудь и использовать его (надеясь, конечно, что он не использует 2.6 качества).

С другой стороны, вы можете просто реализовать то, что утверждает подпроцесс, и написать функцию, которая отправляет SIGTERM в * nix и вызывает TerminateProcess в Windows. Следующая реализация была протестирована на Linux и в Win XP vm вам понадобятся расширения для Python для Windows :

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 голосов
/ 20 сентября 2009

Я последовал предложению Камила Кисиэля относительно использования python 2.6 subprocess.py в python 2.5, и он отлично работал. Чтобы сделать это проще, я создал пакет distutils, который вы можете easy_install и / или включить в buildout.

Чтобы использовать подпроцесс из python 2.6 в проекте python 2.5:

easy_install taras.python26

в вашем коде

from taras.python26 import subprocess

в сборке

[buildout]
parts = subprocess26

[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26
2 голосов
/ 16 февраля 2009

Хотя это не дает прямого ответа на ваш вопрос, возможно, стоит знать.

Импорт из __future__ на самом деле только изменяет параметры компилятора, поэтому, хотя он может превращаться в оператор или заставлять строковые литералы генерировать юникоды вместо strs, он не может изменять возможности и возможности модулей в стандартной библиотеке Python.

1 голос
/ 21 марта 2009

Вот несколько способов завершить процессы в 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)
0 голосов
/ 16 февраля 2009

Ну, Python с открытым исходным кодом, вы можете взять эту функцию pthread из 2.6 и переместить ее в свой собственный код или использовать его в качестве справочного материала для реализации своего собственного.

По очевидным причинам нет способа иметь гибрид Python, который может импортировать части более новых версий.

...