Python 2.5 で Python 2.6 サブプロセス モジュールを使用する
-
23-08-2019 - |
質問
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 のハイブリッドを作成する方法はありません。