Criar automaticamente o requirements.txt

278

Às vezes, faço o download do código-fonte python githube não sei como instalar todas as dependências. Se não houver requirements.txtarquivo, tenho que criá-lo manualmente. A questão é: Dado o diretório de código-fonte python, é possível criar requirements.txtautomaticamente a partir da seção de importação?

Igor Barinov
fonte
2
Você pode fazê-lo em execução pip freeze > requirements.txtirá salvar todas as suas bibliotecas python com a versão atual para requirements.txtarquivo
Shaikhul
7
@Shaikhul mas que não ajuda no caso em que você não tem as dependências instalado porque só agora o download do pacote do GitHub ...
jonrsharpe
8
Observe: a) pip freezefará o dump das versões atuais dos allmódulos instalados nesse sistema, independentemente do uso no projeto atual. b) PIP apenas módulos de lista que foram instalados via pip
akskap
Possível duplicata de Como criar um requirements.txt?
Daniel Santos

Respostas:

290

Se você usa ambiente virtual, pip freeze > requirements.txttudo bem. Se não , pigar será uma boa escolha para você.

A propósito, não garanto que funcione com o 2.6.

ATUALIZAÇÃO :

Recomenda-se o Pipenv ou outras ferramentas para melhorar seu fluxo de desenvolvimento.

Para Python 3, use abaixo

pip3 freeze > requirements.txt
caramba
fonte
3
Para quem está enganando, recomendo tentar pip3 freeze > requirements.txtantes de fazer uma pergunta.
precisa saber é o seguinte
3
Eu executo pip3 freeze > requirements.txte fico surpreso por não encontrar alguns pacotes que estou usando como argparsee configparser. É porque eles fazem parte do núcleo do Python? Acredito que uma resposta melhor é usar pipreqsabaixo, porque ela listará apenas os requisitos que seu projeto está usando.
precisa saber é o seguinte
@ Alexis.Rolland Sim, argparsee configparserpertence à biblioteca padrão do Python3, então, o que há de errado pip3 freeze? Eu não entendo o seu ponto.
Damnever 4/11
11
@damnever Ok, obrigado! pip3 freezefornece a lista de todos os pacotes Python instalados no meu ambiente, enquanto pipreqsfornece todos os que são realmente usados ​​no meu código-fonte, que é o que eu estava procurando. Além disso, nada está errado com isso.
precisa saber é o seguinte
1
pipenv tem problemas graves, consulte esta discussão: news.ycombinator.com/item?id=18612590
Justin M. Keyes
364

Você pode usar o seguinte código para gerar um arquivo requirements.txt:

pip install pipreqs

pipreqs /path/to/project

mais informações relacionadas aos pipreqs podem ser encontradas aqui .

Às vezes você se depara pip freeze, mas isso salva todos os pacotes no ambiente, incluindo aqueles que você não usa no seu projeto atual.

DJanssens
fonte
1
@IgorBarinov isso é um aviso e não criará um problema para executar pipreqs, eu instalei ele em Python 2.6 e tem mesmo aviso, mas ele cria um requirements.txtarquivo, graças @DJanssens
Shaikhul
1
@ Shaikhul Se você recebeu esses avisos, não terá um arquivo completo, apenas fará parte dos requisitos. Você pode verificá-lo no github.com/npow/MemNN/tree/hyperopt repo. Eu tenho apenas 'hyperopt == 0.0.2 numpy = 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor Barinov
1
que disse it is strongly recommended to upgrade to a newer Python version
Shaikhul
2
Ótima ferramenta. Obrigado! O recurso poderoso de gerar exatamente os pacotes usados, não como o pip freeze!
Wesam Na
1
Isso não funciona no Python 3.6, se a nova formatação de saída da instrução print for uesd.
Anand CU
12

No meu caso, eu uso o Anaconda, portanto, a execução do seguinte comando do terminal conda dentro do meu ambiente o resolveu e criei esse arquivo txt de requisitos automaticamente para mim:

conda list -e > requirements.txt

Isso foi retirado deste link do Github pratos / condaenv.txt

Se um erro foi visto e você está usando o anaconda, tente usar a opção .yml:

conda env export > <environment-name>.yml

Para outra pessoa usar o ambiente ... Ou se você estiver criando um novo ambiente em outra máquina: conda env create -f .yml

A opção .yml foi encontrada aqui

HassanSh__3571619
fonte
se você não estiver usando um ambiente virtual, isso criará um arquivo requirements.txt muito longo
SBFRF
1
Isso realmente funciona? Sempre que tentei isso, existem dependências e detalhes de sintaxe que pip install requirements.txtrejeitam.
conner.xyz
Eu encontrei alguns erros usando o .txt, então apenas adicionei a outra opção que também funcionou comigo ... "Usando o .yml" mencionado acima.
HassanSh__3571619 03/03
5

Certifique-se de executar o pip3 para python3.7.

pip3 freeze >> yourfile.txt

Antes de executar o comando acima, verifique se você criou um ambiente virtual.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Depois disso, coloque seu código-fonte no diretório Se você executar o arquivo python agora, provavelmente ele não será iniciado se você estiver usando módulos não nativos. Você pode instalar esses módulos executando

pip3 install <module> or pip install <module> 

Isso não afetará sua lista de módulos inteira, exceto o ambiente em que você está.

Agora você pode executar o comando na parte superior e agora possui um arquivo de requisitos que contém apenas os módulos que você instalou no ambiente virtual. Agora você pode executar o comando na parte superior.

Aconselho a todos que usem ambientes, pois facilita as coisas quando se trata de coisas assim.

Espero que isso tenha ajudado.

johnyjohnny
fonte
1

Se Enfrentar o mesmo problema que o meu, ou seja, não estiver no ambiente virtual e desejar o arquivo requirements.txt para um projeto específico ou da pasta selecionada (inclui filhos) e o pipreqs não for compatível.

Você pode usar :

import os
import sys
from fuzzywuzzy import fuzz
import subprocess

path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"


files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
      for file in files:
        if file.endswith('.py'):
              pyfiles.append(os.path.join(root, file))

stopWords = ['from', 'import',',','.']

importables = []

for file in pyfiles:
    with open(file) as f:
        content = f.readlines()

        for line in content:
            if "import" in line:
                for sw in stopWords:
                    line = ' '.join(line.split(sw))

                importables.append(line.strip().split(' ')[0])

importables = set(importables)

subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)

with open(path+'/requirements.txt') as req:
    modules = req.readlines()
    modules = {m.split('=')[0].lower() : m for m in modules}


notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']

new_requirements = []
for req_module in importables:
    try :
        new_requirements.append(modules[req_module])

    except KeyError:
        for k,v in modules.items():
            if len(req_module)>1 and req_module not in notList:
                if fuzz.partial_ratio(req_module,k) > 90:
                    new_requirements.append(modules[k])

new_requirements = [i for i in set(new_requirements)]

new_requirements

with open(path+'/requirements.txt','w') as req:
    req.write(''.join(new_requirements))

PS: Pode ter algumas bibliotecas adicionais enquanto verifica o fuzzylogic.

DARK_C0D3R
fonte
1

A melhor maneira para o Python 3 é:

pip3 freeze > requirements.txt

funcionou para mim ...

Mac Rathod
fonte
0

se você estiver usando o PyCharm, quando você abre ou clona o projeto no PyCharm, ele mostra um alerta e solicita a instalação de todos os pacotes necessários.

Ahmet
fonte