diff --git a/book/09-modulos/04-modulos-terceiros.ipynb b/book/09-modulos/04-modulos-terceiros.ipynb index ac6fbd6..beb3c3c 100644 --- a/book/09-modulos/04-modulos-terceiros.ipynb +++ b/book/09-modulos/04-modulos-terceiros.ipynb @@ -79,7 +79,14 @@ "source": [ "Ao longo deste capítulo vamos ver como instalar bibliotecas de terceiros, e a ferramenta oficial do Python para instalar bibliotecas é o `pip`, um acrônimo do inglês para package installer for python, que ,traduzido para português, significa *instalador de pacotes do Python*.\n", "\n", - "O `pip` é um gerenciador de pacotes que vem instalado por padrão quando você instala o Python. Com ele você pode instalar, atualizar e remover bibliotecas Python. O `pip` é uma ferramenta de linha de comando, ou seja, você precisa abrir o terminal para utilizá-lo. Não se preocupe, pois vamos aprender a utilizá-lo. Quero só que você entenda o que é por agora." + "O `pip` é um gerenciador de pacotes que vem instalado por padrão quando você instala o Python. Com ele você pode instalar, atualizar e remover bibliotecas Python. O `pip` é uma ferramenta de linha de comando, ou seja, você precisa abrir o terminal para utilizá-lo. Não se preocupe, pois vamos aprender a utilizá-lo. Quero só que você entenda o que é por agora.\n", + "\n", + "É possível verificar se o `pip` está instalado em seu computador executando o comando abaixo no terminal:\n", + "\n", + "```console\n", + "$ pip --version\n", + "pip 24.0\n", + "```" ] }, { @@ -253,6 +260,157 @@ "\n", "... e a lista não pára por aí." ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instalando/desinstalando bibliotecas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Um ponto diferente de módulos nativos do Python é que você precisa instalar as bibliotecas de terceiros antes de utilizá-las. Para isso, você vai utilizar o `pip`, o gerenciador de pacotes do Python, conforme já mencionado anteriormente.\n", + "\n", + "Para instalar uma biblioteca, você precisa executar o comando abaixo no terminal:\n", + "\n", + "```bash\n", + "pip install nome-da-biblioteca\n", + "```\n", + "\n", + "Por exemplo, para instalar a biblioteca `pandas`, você deve executar o comando \n", + "\n", + "```bash\n", + "pip install pandas\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sobre versões de bibliotecas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Já não basta o Python ter suas versões (lembra que vimos nesta seção sobre [versões do Python?](python-version)), ter milhares de bibliotecas disponíveis no PyPI, ainda temos que cada biblioteca tem diferentes versões. Sim, é isso mesmo, seja bem-vindo ao mundo de tecnologia! Tudo evolui em uma velocidade absurdamente alta que fica impossível acompanhar tudo em tempo hábil.\n", + "\n", + "Um exemplo é a biblioteca `numpy`. Veja no [site oficial do Numpy](https://numpy.org/news/#releases) que eles tem várias versões (2.1.1, 2.0.2, 2.1.0, etc.). Quando instalamos uma biblioteca com o `pip`, o padrão é ele sempre instalar a versão mais atual, a mais recente lançada. \n", + "\n", + "Porém, podemos instalar versões específicas de uma biblioteca modificando o comando de instalação. Por exemplo, para instalar a versão específica 2.1.0 do `numpy`, você deve adicionar (sem espaços em branco) dois sinais de igual `==` e a versão que você deseja instalar à frente do nome da biblioteca:\n", + "\n", + "```bash\n", + "pip install numpy==2.1.0\n", + "```\n", + "\n", + "```{admonition} Nota (==)\n", + ":class: note\n", + "Não está errado não, são dois sinais de igual `==` mesmo. Isso é uma convenção do `pip` para instalar uma versão específica de uma biblioteca. Caso você utilize um sinal só de igual `=`, o `pip` vai te mostrar essa mensagem de erro. \n", + "\n", + "O erro basicamente informa que você está usando `=` ao invés de `==`, e sugere a correção.\n", + "\n", + "```bash\n", + "pip install numpy=2.1.0\n", + "ERROR: Invalid requirement: 'numpy=2.1.0'\n", + "Hint: = is not a valid operator. Did you mean == ?\n", + "```\n", + "\n", + "Mas porque eu ia querer instalar uma versão específica diferente da atual? Vou tentar contextualizar com situações de projetos reais de forma simplificada. \n", + "\n", + "- Imagine que você está desenvolvendo um projeto e utiliza a biblioteca `numpy`. Porém, você descobre que a versão mais recente do `numpy` tem um bug que afeta diretamente o seu projeto. Sim, bugs existem, e precisamos lidar com eles!\n", + "\n", + "- Ou então, você está trabalhando em um projeto que foi desenvolvido há alguns anos e utiliza uma versão antiga de uma biblioteca. Se você tentar instalar a versão mais recente, pode ser que o projeto pare de funcionar, pois a nova versão pode ter mudanças que quebram a compatibilidade com o seu projeto.\n", + "\n", + "- E, ainda, suponha que você use as bibliotecas `selenium` e `pandas` em um projeto. Porém, em uma situação hipotética, a versão mais recente do `selenium` pode não é compatível com a versão mais recente do `pandas`. Neste caso, você precisa instalar uma versão específica do `selenium` que seja compatível com a versão do `pandas` que você está utilizando.\n", + "\n", + "Estas são apenas alguns exemplos de situações reais nas quais você pode precisar instalar uma versão específica de uma biblioteca.\n", + "\n", + "```{admonition} Nota (problemas reais do dia-a-dia)\n", + ":class: note\n", + "É, meu caro leitor, aqui já estamos colocando um pézinho no mundo real de projetos! Estamos falando de problemas comuns que inclusive profissionais com mais experiências enfrentam! Não acredita? Não acredite em mim mesmo não, pergunte para qualquer pessoa que trabalha com Python no LinkedIn se ela já teve problemas com conflito de dependências no dia-a-dia dela. Grandes as chances de que a resposta seja sim. E é por isso que é importante você entender esses conceitos desde já.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Instalando várias bibliotecas de uma vez" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uma situação bastante comum em projetos maiores é ter várias dependências de bibliotecas terceiras. Em vez de instalar uma por uma, você pode criar um arquivo chamado `requirements.txt` e listar todas as bibliotecas que você precisa. Por exemplo, o conteúdo de um arquivo `requirements.txt` pode ser (reparem novamente que são dois sinais de igual `==`):\n", + "\n", + "```plaintext\n", + "numpy==1.21.2\n", + "pandas==1.3.3\n", + "matplotlib==3.4.3\n", + "```\n", + "\n", + "Para instalar todas as bibliotecas listadas no arquivo `requirements.txt`, você pode executar o comando abaixo no terminal:\n", + "\n", + "```bash\n", + "pip install -r requirements.txt\n", + "```\n", + "\n", + "O `pip` vai ler o arquivo `requirements.txt` e instalar todas as bibliotecas listadas nele. Esta forma de instalação de várias bibliotecas com um único comando é muito útil para garantir que todos os desenvolvedores que trabalham em um projeto tenham as mesmas versões das bibliotecas instaladas. \n", + "\n", + "E é uma **boa prática** também **fixar as versões das bibliotecas usadas com == para evitar conflito de dependências**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Desinstalando bibliotecas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aqui não há muito segredo. Para desinstalar uma biblioteca, você precisa executar o comando abaixo no terminal:\n", + "\n", + "```bash\n", + "pip uninstall nome-da-biblioteca\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Utilizando bibliotecas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uma vez que uma determinada biblioteca está instalada, podemos importá-la em nossos scripts Python da mesma forma que importamos módulos nativos do Python. Um exemplo de script que importa as bibliotecas `numpy` e `pandas`:\n", + "\n", + "```python\n", + "import numpy as np\n", + "import pandas as pd\n", + "```\n", + "\n", + "Aqui estamos trazendo todas as funcionalidades das duas bibliotecas para o escopo do nosso script. A partir daí, podemos utilizar todas as funções e classes disponíveis nas bibliotecas `numpy` e `pandas`.\n", + "\n", + "```{admonition} Nota (apelido ou alias)\n", + ":class: note\n", + "Repare que estamos utilizando `as np` e `as pd` para criar um apelido (ou alias) para as bibliotecas `numpy` e `pandas`, respectivamente. Isso é uma convenção muito comum na comunidade Python, pois economiza tempo e evita digitar o nome completo da biblioteca toda vez que você for utilizá-la. \n", + "\n", + "Ao invés de usar, por exemplo, `pandas.DataFrame`, você pode usar `pd.DataFrame` chamando as funcionalidades da biblioteca pelo apelido ao invés do nome completo.\n", + "```" + ] } ], "metadata": {