使用Python2.6子流程模块中的蟒蛇2.5
-
23-08-2019 - |
题
我想用Python2.6的版本子过程,因为它允许的 Popen.终止() 功能,但我被困与Python2.5.是有一些合理的清洁方式使用的新版本的模块在我的2.5代码?某种 from __future__ import subprocess_module
?
解决方案
我知道这个问题已经回答了,但它的价值,我用的是Python 2.3的船舶与Python 2.6和它的工作罚款subprocess.py
。如果您在文件的顶端阅读注释,它说:
# This module should remain compatible with Python 2.2, see PEP 291.
其他提示
是不是真的有一个伟大的方式来做到这一点。子是在python 实现(相对于C),所以你可以在模块可以想象某处复制并使用它(希望当然,它并没有使用任何2.6善良)。
在另一方面,你可以简单地实现什么子声称要做,写发送在* nix SIGTERM和Windows调用了TerminateProcess函数。下面的实现已经在Linux和在Win XP的虚拟机进行了测试,你将需要蟒蛇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__
进口实际上只改变编译器选项,因此,虽然它可以把与到语句或使字符串文字产生统一码,而不是可疑交易,它不能改变在Python标准库模块的功能和特性。
我跟着在Python 2.5使用python 2.6 subprocess.py关于卡米尔Kisiel的建议它完美地工作。为了更方便,我创建了一个distutils的包,您可以easy_install的和/或包含在扩建。
要在python 2.5项目中使用的子过程从蟒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和其移动到自己的代码,或将其作为一个参考,以实现自己的。
有关原因,应该是显而易见的没有办法有一个Python的混合体,它可以导入新版本的部分。