Compilando um módulo Python para Windows usando Visual Studio Express
Autor: Juliano Heyse | Publicado: 2014-06-17T22:15:00-03:00

Meu universo de trabalho, para bem ou para mal, é Windows. É para Windows que eu preciso desenvolver soluções.

Python não é muito amigável para o ambiente Windows, mas já foi muito pior. Às vezes precisamos de um módulo e quando vamos à página do autor só encontramos o código fonte compactado como um tar.gz. Nestes casos, costumamos encontrar muito módulos já compilados na excelente coleção do Christoph Gohlke.

Mesmo assim, pode-se encontrar algum módulo que o Gohlke não incluiu na sua lista, além de ser ruim ficar na dependência de terceiros. Aí precisamos estar preparados para compilar o código fonte.

Para isso, segui a excelente receita do Victor Jabur. Conto aqui a minha experiência em compilar a versão mais recente do PyCrypto com algumas particularidades do meu ambiente.


Sequência
As instruções do Victor Jabur funcionaram para mim (só trabalho com 32 bits e por isso segui a segunda parte do artigo dele). Eis a sequência sem muitos detalhes:

1. Instalação do Visual C++ 2008 Express Edition - A versão 2008 é necessária para utilização com Python 2.6 a 3.2. De 3.3 para a frente passou-se a usar a versão 2010 no CPython.

2. Eu já tinha o Python 2.7 e o setuptools instalados. Não foi necessário reinstalar.

3. Edite os dois arquivos que do disutils conforme as instruções do Victor Jabur. Primeiro o arquivo [caminho instalação do python]/Lib/distutils/msvccompiler.py: insira a linha 

 
def get_build_version():
    """Return the version of MSVC that was used to build Python.

    For Python 2.3 and up, the version number is included in
    sys.version.  For earlier versions, assume the compiler is MSVC 6.
    """
    return 9.0 #&lt;== INSIRA ESTA LINHA
    prefix = "MSC v."
    i = string.find(sys.version, prefix)
    if i == -1:
        return 6
    i = i + len(prefix)
    s, rest = sys.version[i:].split(" ", 1)
    majorVersion = int(s[:-2]) - 6
    minorVersion = int(s[2:3]) / 10.0
    # I don't think paths are affected by minor version in version 6
    if majorVersion == 6:
        minorVersion = 0
    if majorVersion &gt;= 6:
        return majorVersion + minorVersion
    # else we don't know what version of the compiler this is
    return None

Para mim, esta função estava na linha 153.&nbsp;

4. &nbsp;Agora edite também o arquivo [caminho instalação do python]/Lib/distutils/msvc9compiler.py. Fica assim:

    
def manifest_setup_ldargs(self, output_filename, build_temp, ld_args):
    # If we need a manifest at all, an embedded manifest is recommended.
    # See MSDN article titled
    # "How to: Embed a Manifest Inside a C/C++ Application"
    # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx)
    # Ask the linker to generate the manifest in the temp dir, so
    # we can check it, and possibly embed it, later.
    temp_manifest = os.path.join(
        build_temp,
        os.path.basename(output_filename) + ".manifest")
    ld_args.append('/MANIFESTFILE:' + temp_manifest)
    ld_args.append('/MANIFEST')  # &lt;== INSIRA ESTA LINHA



5. Baixe os arquivos fonte do módulo que você deseja compilar e extraia em alguma pasta à sua escolha.

6. Na pasta onde estão os arquivos fonte utilize os seguintes comandos:

python setup.py build --compiler msvc
python setup.py install
python setup.py bdist_wininst 

Feito. Se tudo correu bem, já temos o módulo devidamente compilado e instalado. Na lista de comandos do item 6, o último comando é opcional e é usado para gerar um instalador com interface gráfica para o ambiente Windows.