我想使用Python 2.6的子进程版本,因为它允许Popen.terminate()函数,但我坚持使用Python 2.5。在我的2.5代码中使用较新版本的模块是否有一些相当干净的方法?某种from __future__ import subprocess_module
?
答案 0 :(得分:9)
我知道这个问题已经得到了回答,但是对于它的价值,我已经在Python 2.3中使用了Python 2.6附带的subprocess.py
并且它运行良好。如果您阅读文件顶部的注释,则说明:
# This module should remain compatible with Python 2.2, see PEP 291.
答案 1 :(得分:6)
实际上并没有很好的方法。 subprocess是implemented in python(而不是C),所以你可以想象在某处复制模块并使用它(当然希望它不使用任何2.6优点)。
另一方面,您可以简单地实现子进程声明要执行的操作,并编写一个在* nix上发送SIGTERM并在Windows上调用TerminateProcess的函数。以下实现已在Linux和Win XP vm中测试过,您需要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
代码而不是整个模块。
答案 2 :(得分:2)
虽然这不能直接回答你的问题,但可能值得了解。
来自__future__
的导入实际上只改变编译器选项,因此虽然它可以转换为语句或使字符串文字生成unicode而不是strs,但它不能改变Python标准中模块的功能和特性库。
答案 3 :(得分:2)
我遵循了Kamil Kisiel关于在python 2.5中使用python 2.6 subprocess.py的建议,它运行得很好。为了方便起见,我创建了一个distutils包,您可以轻松地安装和/或包含在buildout中。
在python 2.5项目中使用python 2.6的子进程:
easy_install taras.python26
代码
from taras.python26 import subprocess
在buildout中
[buildout]
parts = subprocess26
[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26
答案 4 :(得分:1)
以下是一些在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)
答案 5 :(得分:0)
Python是开源的,您可以自由地从2.6中获取该pthread函数并将其移动到您自己的代码中,或者将其用作实现您自己的代码的参考。
由于显而易见的原因,无法使用可以导入部分新版本的Python混合。