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?


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

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

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.


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


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.


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.


1

A melhor maneira para o Python 3 é:

pip3 freeze > requirements.txt

funcionou para mim ...


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.