Usando Numpy e Pandas no Node.js
Se você usa exclusivamente um ambiente Node.js e, de repente, precisa daquela biblioteca Python que não possui equivalente para Node, eu tenho a solução.
Todos sabemos da grande capacidade do Python em ser útil para trabalhos de análise e processamento de dados. Sobretudo para computação científica e afins. Isso se deve principalmente ao seu grande leque de bibliotecas com essa finalidade, como Numpy, Pandas e etc. A diferença de performance que principalmente o numpy pode dar ao python é absurda, o que faz com que a linguagem seja a escolha perfeita para computação científica na maioria dos casos, pois é uma linguagem simples e com uma ótima legibilidade do código. Alie isso à performance do C e verá do porquê Python é uma das linguagens do momento.
É claro que isso é uma visão muito simplista do todo, existem muito mais variáveis que contribuem para essa ascensão do Python. Mas o fato de termos bibliotecas escritas em Fortran, C e C++ que utilizam o Python como um frontend é o que traz realmente o destaque para a linguagem, dentre vários outros fatores. Infelizmente nem todas as linguagens tem essa sorte, mas hoje em dia integração entre várias linguagens de programação não são um problema.
Não é mistério para ninguém que hoje a web e o mobile são duas áreas que têm um grande crescimento dia após dia na tecnologia. E surfando nessa onda nós temos o javascript, que tem praticamente um monopólio quando se trata de Frontend web. Mas nem só de Front vive o javascript, também temos o Node.js que faz com que a linguagem trabalhe também no backend. Não vou entrar no mérito de discutir se o Node é ou não é o melhor, todos sabemos que não é, assim como o próprio Python, mas é utilizado, então devemos pelo menos conhecer.
Com o advento do Node cada dia mais se fala de fullstack, pois a ferramenta facilita absurdamente que iniciantes tenham contato tanto com o Front quanto com o Back, sem o atrito de precisarem aprender mais de uma linguagem. Esse não é um assunto novo, mas está cada dia mais recorrente no nosso meio. O que precisamos entender é que o Javascript está intimamente ligado com a web e suas facetas, sobretudo com o Frontend. Isso nos dá inúmeras ferramentas para lidar com web, como Express, Fastfy, React, Svelte, Vue, Angular e por aí vai. Mas quando precisamos de algo tão robusto quanto para análise de dados, não temos praticamente nenhuma ferramenta.
Por isso foi criado o pymport, para integrar facilmente bibliotecas do Python com o Node.
Vamos direto ao ponto:
> npm install pymport
> npx pympip3 install numpy
// index.js
import { pymport } from 'pymport/profixied'
const np = pymport('numpy')
const a = np.arange(5)
console.log(a.toString())
// [ 0 1 2 3 4 ]
Bem simples!
Como a biblioteca funciona?
O pymport basicamente te permite usar bibliotecas Python de forma transparente no Node.js. Ele possui um interpretador Python completo e incorporado (mas é possível também configurar uma instalação existente do Python). Os dois interpretadores compartilham a mesma thread principal e mesmo espaço de memória, mas os objetos de Python e Node permanecem separados. O Node pode acessar os objetos Python que tem o tipo PyObject
, enquanto o Python não pode acessar os objetos do Node.
Ao passar objetos entre os dois interpretadores:
- A conversão de Javascript para Python é automática e por cópia
- Objetos Python são passados por referência para o Javascript como um
PyObject
- Existe uma pequena equivalência de tipos entre Python e Javascript que permite transformar variáveis
- Python inline também é suportado através da estrutura pyval
Funções também podem ser passadas livremente entre os interpretadores. Toda vez que uma função inter-linguagem é chamada ela é executada pelo seu interpretador correspondente. Seus argumentos também vão ser convertidos de acordo com as mesmas regras.
Importando módulos locais
O pymport é feito usando bibliotecas Python dentro do Node.js, então quando importamos bibliotecas Python, por padrão o pyimport irá pesquesar somente caminhos para bibliotecas.
Antes de importar um módulo do usuário do diretório atual, ou de qualquer outro diretório local, a variável de ambiente PYTHONPATH
deve ser atribuída antes de inicializar o Python. Se você utiliza CommonJS isso pode facilmente ser feito antes do require
:
process.env['PYTHONPATH'] = _dirname;
const { pymport } = require('pyimport');
Em Typescript ou com ES6 Modules, deve-se atribuir a variável através do ambiente (ou com o dotenv).
Caso tenha gostado dessa dica não deixe de acessar o repositório oficial do pymport e a sua documentação.