Crear automáticamente require.txt

278

A veces descargo el código fuente de Python githuby no sé cómo instalar todas las dependencias. Si no hay un requirements.txtarchivo, tengo que crearlo a mano. La pregunta es: dado el directorio del código fuente de Python, ¿es posible crear requirements.txtautomáticamente desde la sección de importación?

Igor Barinov
fuente
2
Puede hacerlo ejecutando pip freeze > requirements.txtguardará todas sus bibliotecas de Python con la versión actual en el requirements.txtarchivo
Shaikhul
77
@Shaikhul, pero eso no ayuda en el caso de que no tenga instaladas las dependencias porque acaba de descargar el paquete de GitHub ...
jonrsharpe
8
Tenga en cuenta: a) pip freezevolcará las versiones actuales de alllos módulos instalados en ese sistema independientemente de su uso en el proyecto actual. b) pip solo enumerará los módulos que se han instalado a través de pip
akskap
Posible duplicado de Cómo crear un require.txt?
Daniel Santos

Respuestas:

291

Si usa un entorno virtual, pip freeze > requirements.txtestá bien. SI NO , pigar será una buena opción para usted.

Por cierto, no me aseguro de que funcione con 2.6.

ACTUALIZACIÓN :

Se recomienda Pipenv u otras herramientas para mejorar su flujo de desarrollo.

Para Python 3 use a continuación

pip3 freeze > requirements.txt
nunca
fuente
3
Para cualquier error, recomiendo probar pip3 freeze > requirements.txtantes de hacer una pregunta.
baranskistad
3
Ejecuto pip3 freeze > requirements.txty me sorprende no encontrar algunos paquetes que estoy usando, como argparsey configparser. ¿Es porque son parte del núcleo de Python? Creo que una mejor respuesta es usar a pipreqscontinuación porque solo enumerará los requisitos que está utilizando su proyecto.
Alexis.Rolland
@ Alexis.Rolland Sí, argparsey configparserpertenece a la biblioteca estándar de Python3, entonces, ¿qué tiene de malo pip3 freeze? No entiendo tu punto.
nunca el
11
@damnever Ok, gracias! pip3 freezeme da la lista de todos los paquetes de Python instalados en mi entorno, mientras pipreqsque me da todos los que realmente utilicé en mi código fuente, que es lo que estaba buscando. Además de eso, no tiene nada de malo.
Alexis.Rolland
1
pipenv tiene problemas serios, vea esta discusión: news.ycombinator.com/item?id=18612590
Justin M. Keyes
364

Puede usar el siguiente código para generar un archivo require.txt:

pip install pipreqs

pipreqs /path/to/project

Puede encontrar más información relacionada con pipreqs aquí .

A veces te encuentras pip freeze, pero esto guarda todos los paquetes en el entorno, incluidos los que no utilizas en tu proyecto actual.

DJanssens
fuente
1
@IgorBarinov es una Advertencia y no creará un problema para ejecutar pipreqs, lo instalé en python 2.6 y obtuve la misma advertencia, pero crea un requirements.txtarchivo, gracias @DJanssens
Shaikhul
1
@Shaikhul si recibió estas advertencias, no tendrá un archivo completo, solo obtendrá una parte de los requisitos. Puede verificarlo en github.com/npow/MemNN/tree/hyperopt repo. Solo tengo 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor Barinov
1
Dicho esto it is strongly recommended to upgrade to a newer Python version
Shaikhul
2
Gran herramienta ¡Gracias! ¡La poderosa característica de que genera exactamente los paquetes usados, no como pip freeze!
Wesam Na
1
Esto no funciona para Python 3.6, si el nuevo formato de salida de la declaración de impresión es uesd.
Anand CU
12

En mi caso, uso Anaconda, por lo que ejecutar el siguiente comando desde la terminal conda dentro de mi entorno lo resolvió y creó este archivo txt de requisitos para mí automáticamente:

conda list -e > requirements.txt

Esto fue tomado de este enlace de Github pratos / condaenv.txt

Si se ha visto un error y está usando anaconda, intente usar la opción .yml:

conda env export > <environment-name>.yml

Para que otra persona use el entorno ... O si está creando un nuevo entorno en otra máquina: conda env create -f .yml

La opción .yml se ha encontrado aquí

HassanSh__3571619
fuente
si no está utilizando un entorno virtual, esto creará un archivo
require.txt
1
¿Esto realmente funciona? Cada vez que lo he intentado, hay dependencias y detalles de sintaxis que pip install requirements.txtrechaza.
conner.xyz
Encontré algunos errores al usar el .txt, así que agregué la otra opción que también funcionó conmigo ... "Usar el .yml" mencionado anteriormente.
HassanSh__3571619
5

Asegúrese de ejecutar pip3 para python3.7.

pip3 freeze >> yourfile.txt

Antes de ejecutar el comando anterior, asegúrese de haber creado un entorno virtual.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Después de eso, ponga su código fuente en el directorio. Si ejecuta el archivo python ahora, probablemente no se iniciará si está utilizando módulos no nativos. Puedes instalar esos módulos corriendo

pip3 install <module> or pip install <module> 

Esto no afectará su lista completa de módulos, excepto el entorno en el que se encuentra.

Ahora puede ejecutar el comando en la parte superior y ahora tiene un archivo de requisitos que contiene solo los módulos que instaló en el entorno virtual. Ahora puede ejecutar el comando en la parte superior.

Aconsejo a todos que usen entornos, ya que facilita las cosas cuando se trata de cosas como esta.

Espero que esto haya ayudado.

johnyjohnny
fuente
1

Si enfrenta el mismo problema que el mío, es decir, no está en el entorno virtual y quiere require.txt para un proyecto específico o de la carpeta seleccionada (incluye elementos secundarios ) y pipreqs no es compatible.

Puedes 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))

PD: puede tener algunas bibliotecas adicionales, ya que comprueba fuzzylogic.

DARK_C0D3R
fuente
1

La mejor manera para Python 3 es:

pip3 freeze > requirements.txt

funcionó para mí ...

Mac Rathod
fuente
0

si está utilizando PyCharm, cuando abre o clona el proyecto en PyCharm, muestra una alerta y le solicita que instale todos los paquetes necesarios.

Ahmet
fuente