Автоматично створювати вимоги.txt


277

Іноді я завантажую вихідний код python githubі не знаю, як встановити всі залежності. Якщо немає requirements.txtфайлу, я повинен створити його від руки. Питання: Враховуючи каталог вихідного коду python, чи можливо створити requirements.txtавтоматично з розділу імпорту?


2
Ви можете це зробити, запустивши, pip freeze > requirements.txtви збережете всі ваші бібліотеки python з поточною версією у requirements.txtфайл
Shaikhul

7
@Shaikhul, але це не допомагає у випадку, коли у вас немає встановлених залежностей, оскільки ви тільки що завантажили пакунок з GitHub ...
jonrsharpe

8
Зверніть увагу: а) pip freezeскидає поточні версії allвстановлених модулів у цій системі незалежно від використання в поточному проекті. b) pip перелічить лише модулі, встановлені через pip
akskap

Відповіді:


290

Якщо ви використовуєте віртуальне середовище, pip freeze > requirements.txtпросто чудово. ЯКЩО НЕ , свинар буде хорошим вибором для вас.

До речі, я не впевнений, що це буде працювати з 2.6.

ОНОВЛЕННЯ :

Pipenv або інші інструменти рекомендуються для покращення потоку розвитку.

Для Python 3 використовуйте нижче

pip3 freeze > requirements.txt

3
Якщо хтось помилився, рекомендую спробувати, pip3 freeze > requirements.txtперш ніж задавати питання.
baranskistad

3
Я виконую, pip3 freeze > requirements.txtі я здивований, що не знайду таких пакетів, якими я фактично користуюся, такими як argparseі configparser. Це тому, що вони є частиною ядра Python? Я вважаю, що кращою відповіддю є використання pipreqsнижче, оскільки це лише перелік вимог, які використовує ваш проект.
Alexis.Rolland

@ Alexis.Rolland Так, argparseі configparserналежить до стандартної бібліотеки Python3, тож, що не так pip3 freeze? Я не розумію вашої точки зору.
небудь

11
@damnever Ok, дякую! pip3 freezeдає мені список усіх пакетів Python, встановлених у моєму середовищі, тоді як pipreqsдає мені всі ті, які фактично використовуються у моєму вихідному коді, саме те, що я шукав. Крім цього, нічого поганого в цьому немає.
Alexis.Rolland

1
Пипенв має серйозні проблеми, дивіться цю дискусію: news.ycombinator.com/item?id=18612590
Джастін М.

364

Ви можете використовувати наступний код для генерування файлу вимог.txt:

pip install pipreqs

pipreqs /path/to/project

Більше інформації, пов'язаної з pipreqs, можна знайти тут .

Іноді ви стикаєтесь pip freeze, але це зберігає всі пакети в оточенні, включаючи ті, які ви не використовуєте в поточному проекті.


1
@IgorBarinov це попередження і не створить проблеми для запуску pipreqs, я встановив його на python 2.6 і отримав таке ж попередження, але він створює requirements.txtфайл, дякую @DJanssens
Shaikhul

1
@Shaikhul якщо ви отримаєте ці попередження, у вас не буде повного файлу, ви просто отримаєте частину вимог. Ви можете перевірити це на github.com/npow/MemNN/tree/hyperopt repo. У мене лише 'hyperopt == 0,0,2 numpy == 1,9,2 scikit_learn == 0,16,1 theano == 0,7,0'
Ігор Баринов

1
що сказав it is strongly recommended to upgrade to a newer Python version
Шайхул

2
Чудовий інструмент. Дякую! Потужна його особливість у тому, що він генерує саме використані пакети, а не як заморожування піп!
Везам На

1
Це не працює для Python 3.6, якщо форматування виводу нової операції друку є uesd.
Ананд КУ

12

У моєму випадку я використовую Anaconda, тому виконання наступної команди з терміналу conda в моєму середовищі вирішило її, і створив цей файл txt-файл вимог для мене автоматично:

conda list -e > requirements.txt

Це було взято з цього посилання на Github pratos / condaenv.txt

Якщо ви побачили помилку, і ви використовуєте анаконду, спробуйте скористатися параметром .yml:

conda env export > <environment-name>.yml

Щоб інша людина використовувала довкілля ... Або якщо ви створюєте нове оточення на іншій машині: conda env create -f .yml

Тут знайдено варіант .yml


якщо ви не використовуєте віртуальне середовище, це створить надто довгий файл
вимог.txt

1
Це насправді працює? Кожного разу, коли я це намагався, виникають залежності та деталі синтаксису, які pip install requirements.txtвідкидає.
conner.xyz

Я знайшов деякі помилки за допомогою .txt, тому просто додав інший варіант, який працював і зі мною ... "Використання .yml", згаданого вище.
HassanSh__3571619

5

Обов’язково запускайте pip3 для python3.7.

pip3 freeze >> yourfile.txt

Перш ніж виконати вищевказану команду, переконайтеся, що ви створили віртуальне середовище.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Після цього введіть свій вихідний код у каталог. Якщо ви зараз запустите файл python, він, ймовірно, не запуститься, якщо ви використовуєте неродні модулі. Ви можете встановити ці модулі, які працюють

pip3 install <module> or pip install <module> 

Це не вплине на весь список модулів, крім середовища, в якому ви перебуваєте.

Тепер ви можете виконати команду вгорі, і тепер у вас є файл вимог, який містить лише модулі, встановлені у віртуальному середовищі. Тепер ви можете запустити команду вгорі.

Я раджу всім використовувати середовище, оскільки це полегшує справи, коли мова йде про подібні речі.

Сподіваюся, що це допомогло.


1

Якщо стикатися з тією ж проблемою, що і моя, тобто не у віртуальному середовищі та вимагає вимог.txt для конкретного проекту або з вибраної папки (включає дітей) і pipreqs не підтримує.

Ви можете використовувати:

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: У нього може бути кілька додаткових бібліотек, оскільки він перевіряє нечіткість.


1

Найкращий спосіб для Python 3:

pip3 freeze > requirements.txt

це працювало для мене ...


0

якщо ви використовуєте PyCharm, коли ви відкриваєте або клонуєте проект у PyCharm, він відображає попередження та просить вас встановити всі необхідні пакети.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.