Python for .NET

William Ivanski Python for .NET é um software que permite que programadores escrevam scripts Python usando objetos e bibliotecas do framework .NET. Não é uma implementação de Python sobre .NET, como o IronPython, mas sim um software que integra Python e .NET. A vantagem de Python for .NET é que você pode usar bibliotecas e módulos Python inteiros (como TkInter ou PyGame) e ao mesmo tempo usar todas as funcionalidades e bibliotecas do .NET, no mesmo script.

O desenvolvimento do Python for .NET está sendo feito no repositório no GitHub. Você deve baixar o repositório e compilar no VisualStudio ou MonoDevelop. Mas, eu já compilei e disponibilizei, então se você está com pressa, você pode baixar os seguintes arquivos e colocá-los em uma pasta no seu computador:

Nessa pasta no repositório da biblioteca Spartacus no GitHub, você encontra todos esses arquivos e também os scripts de exemplo desse artigo.

Python puro: raw_input e print

No Python, a entrada de dados pelo console é feita através da função raw_input. Então, cole o conteúdo abaixo em um arquivo chamado rawinput.py:

v_nome = raw_input('Digite o seu nome?\n')
print 'Ola, %s.' % v_nome

Você poderá executá-lo no Python da seguinte maneira:

python rawinput.py

Agora tente executar com o nPython, assim:

mono nPython.exe rawinput.py

Você deve ter notado duas coisas:

  • 1) É necessário usar o mono para executar o nPython, ou Python for .NET. Isso porque nPython.exe é um programa escrito em C#;
  • 2) O mesmo script funciona da mesma forma tanto com Python quanto com nPython. Isso porque o nPython utiliza a libpython para executar os códigos em Python puro, assim como o interpretador Python.

Python for .NET: Console.ReadLine e Console.WriteLine

Agora vamos de fato escrever um script em Python que utiliza classes e métodos do .NET. Note que esse script não funcionará usando o interpretador python convencional, apenas nPython. Cole o conteúdo abaixo em um arquivo chamado console.py:

import clr
from System import Console

Console.Write("Digite o seu nome: ")
v_nome = Console.ReadLine()
Console.WriteLine("Ola, " + v_nome + ".")

Para rodar:

mono nPython.exe console.py

Python puro: array

Vamos fazer um teste com vetores. Copie e cole o conteúdo abaixo e salve em um arquivo chamado array.py:

v_amigos = ['john', 'pat', 'gary', 'michael']
for a in v_amigos:
    print "Esse eh meu amigo {0}".format(a)

Você pode rodar tanto no python quanto no nPython, porque esse script contém apenas Python puro.

Python for .NET: List<T>

Agora, ao invés de array de Python, vamos usar o List<T> do .NET. Copie o conteúdo abaixo e salve em um arquivo chamado list.py:

import clr
import System
from System import Console

v_list = System.Collections.Generic.List[System.String]()
v_list.Add("john")
v_list.Add("pat")
v_list.Add("gary")
v_list.Add("michael")

for a in v_list:
	print "Esse eh meu amigo " + a

Note que, propositalmente, eu usei print ao invés de Console.WriteLine para escrever. Ora, print é muito mais prático do que Console.WriteLine. Essa é a beleza do Python for .NET: poder combinar a praticidade do Python com o poder do .NET.

Spartacus

Agora um teste que, pra mim, é o mais importante de todos: poder utilizar a biblioteca Spartacus no Python. Todos sabem que a biblioteca Spartacus é escrita em C# puro, e que possui um número gigante de funcionalidades. Por exemplo, com Spartacus é muito fácil acessar diversos bancos de dados. Já no Python, seria necessário estudar os drivers de conexão, conforme a tecnologia de banco de dados que eu esteja querendo acessar, o que seria muito trabalhoso. Eu já tive todo esse trabalho e já tratei todas as possibilidades, erros e particularidades na Spartacus. Portanto, poder utilizar Spartacus é fundamental pra mim.

Então, vamos baixar o arquivo basecadastro.db. Esse é um banco de dados em SQLite. Não esqueça de baixar também a Spartacus.dll. Vamos então escrever um script python chamado bancodedados.py com o seguinte conteúdo:

import clr
clr.AddReference("System.Data")
clr.AddReference("System.Xml")
clr.AddReference("Spartacus")
import Spartacus

try:
    v_database = Spartacus.Database.Sqlite("basecadastro.db")
    v_table = v_database.Query("select * from paises", "PAISES")
    for r in v_table.Rows:
        print("{0} {1}".format(r["pais_st_codigo"], r["pais_st_nome"]))
except Spartacus.Database.Exception as exc:
    print("ERRO: {0}".format(exc.v_message))

O código é enxuto e elegante... Será que funciona? Para rodar:

mono nPython.exe bancodedados.py

Funciona!! Agora sim eu estou contente. Até hoje eu só tinha usado Spartacus no C#. Ver uma biblioteca tão complexa rodando no Python, sem perda de desempenho, é muito bacana. Com isso, é possível escrever scripts para automatizar muitas coisas no dia a dia. Espero que o Python for .NET tenha sido útil pra você também!