2015年3月11日星期三

在Windows上用x64的Python运行GoAgent

首先声明:本文适用于至少懂编程,并且爱折腾的人。不一定要很熟悉Python,但至少应该入过门了。

GoAgent自带Python27运行环境,不过因为本机上也安装了Python 2.7 x64,所以希望能直接使用我安装的64位版本。总结下来,要点有:
  • 无论你是否准备使用x64版Python。GoAgent与Python 2.7.9不兼容,应该安装Python 2.7.8版本。
  • 要运行GoAgent还需要gevent和pyOpenSSL。可以手动安装,也可以通过pip来安装。推荐后者因为省事。
  • Python 2.7.8(无论是否x64)及更早的版本,没有自带pip。所以要去下载get-pip.py,然后用python运行这个脚本安装pip。
    ps:用get-pip.py下载到的pip.exe的版本,比Python 2.7.9里面带的要新一些。所以就算有自带我也会换掉它。

另一个重点来了:
有些版本的GoAgent里面对于crypt32.dll的加载代码在x64的Python中有问题,需要修改。改成像这样就可以了:
crypt32 = ctypes.WinDLL(u'crypt32.dll')
crypt32_handle = crypt32._handle
释放的时候要这样:
ctypes.windll.kernel32.FreeLibrary.argtypes = [HMODULE]
ctypes.windll.kernel32.FreeLibrary(crypt32_handle)
在前面还要:
from ctypes.wintypes import *
否则x64下会报错,因为HMODULE和long的长度在x64下不一样了。

我用的2.1.17的GoAgent中,对于crypt32.dll的加载代码还位于proxy.py中。最新的GoAgent已经移到proxylib.py里面了。什么时候移的我没有去考察过。代码改法可能略有不同,不过思路应该是一样的。

折腾好以后。把本机上的Python.exe复制一份改名成Python27.exe。接下来就可以把GoAgent自带的Python27.*给删掉啦。