質問

Python 2.6 のバージョンのサブプロセスを使用したいと思います。 Popen.terminate() 関数ですが、私は Python 2.5 で行き詰まっています。2.5 のコードで新しいバージョンのモジュールを使用する合理的な方法はありますか?ある種の from __future__ import subprocess_module?

役に立ちましたか?

解決

この質問にはすでに回答があることは承知していますが、価値があるものとして、私は subprocess.py これは Python 2.3 の Python 2.6 に付属しており、正常に動作しています。ファイルの先頭にあるコメントを読むと、次のように書かれています。

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

他のヒント

あまり良い方法はありません。サブプロセスは Pythonで実装される (C とは対照的に) そのため、モジュールをどこかにコピーして使用することもできます (もちろん、2.6 の利点を使用しないことを願っています)。

一方、サブプロセスが行うべきことを単純に実装し、*nix で SIGTERM を送信し、Windows で TerminateProcess を呼び出す関数を作成することもできます。次の実装は 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 モジュール全体ではなくコードです。

これはあなたの質問に直接答えるものではありませんが、知っておく価値はあるかもしれません。

からの輸入 __future__ 実際にはコンパイラ オプションを変更するだけなので、 with をステートメントに変換したり、文字列リテラルに str の代わりに Unicode を生成させることはできますが、Python 標準ライブラリのモジュールの機能や機能を変更することはできません。

Python 2.5でのPython 2.6のsubprocess.pyの使用に関するKamil Kisielの提案に従いましたが、完璧に機能しました。これを簡単にするために、easy_install やビルドアウトに含めることができる 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

ここでは、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)

Python はオープンソースなので、2.6 の pthread 関数を自由に取得して独自のコードに移動したり、独自のコードを実装するためのリファレンスとして使用したりできます。

明らかな理由により、新しいバージョンの一部をインポートできる Python のハイブリッドを作成する方法はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top