Tự động tạo yêu cầu.txt


276

Đôi khi tôi tải xuống mã nguồn python từ githubvà không biết cách cài đặt tất cả các phụ thuộc. Nếu không có requirements.txttập tin tôi phải tạo nó bằng tay. Câu hỏi là: Với thư mục mã nguồn python có thể requirements.txttự động tạo từ phần nhập không?


2
Bạn có thể làm điều đó bằng cách chạy pip freeze > requirements.txtsẽ lưu tất cả các thư viện python của bạn với phiên bản hiện tại vào requirements.txttệp
Shaikhul

7
@Shaikhul nhưng điều đó không giúp ích gì trong trường hợp bạn không cài đặt các phụ thuộc vì bạn chỉ mới tải xuống gói từ GitHub ...
jonrsharpe

8
Xin lưu ý: a) pip freezesẽ kết xuất các phiên bản hiện tại của allcác mô-đun đã cài đặt trên hệ thống đó bất kể việc sử dụng trong dự án hiện tại. b) Pip sẽ chỉ liệt kê các mô-đun đã được cài đặt qua pip
akskap

Bản sao có thể có của Cách tạo tệp.txt.txt?
Daniel Santos

Câu trả lời:


289

Nếu bạn sử dụng môi trường ảo, pip freeze > requirements.txttốt thôi. NẾU KHÔNG , pigar sẽ là một lựa chọn tốt cho bạn.

Nhân tiện, tôi không đảm bảo nó sẽ hoạt động với 2.6.

CẬP NHẬT :

Pipenv hoặc các công cụ khác được khuyến nghị để cải thiện dòng phát triển của bạn.

Đối với Python 3 sử dụng bên dưới

pip3 freeze > requirements.txt

3
Đối với bất kỳ ai có lỗi, tôi khuyên bạn nên thử pip3 freeze > requirements.txttrước khi đặt câu hỏi.
baranskistad

3
Tôi thực thi pip3 freeze > requirements.txtvà tôi ngạc nhiên khi không tìm thấy một số gói tôi thực sự đang sử dụng như argparseconfigparser. Có phải vì chúng là một phần của lõi Python? Tôi tin rằng một câu trả lời tốt hơn là sử dụng pipreqsdưới đây vì nó sẽ chỉ liệt kê các yêu cầu mà dự án của bạn đang sử dụng.
Alexis.Rolland

@ Alexis.Rolland Có, argparseconfigparserthuộc về thư viện chuẩn Python3, vậy, có chuyện gì với pip3 freeze? Tôi không nhận được quan điểm của bạn.
chết tiệt

11
@damnever Ok cảm ơn bạn! pip3 freezecung cấp cho tôi danh sách tất cả các gói Python được cài đặt trong môi trường của tôi trong khi pipreqscung cấp cho tôi tất cả các gói thực sự được sử dụng trong mã nguồn của tôi, đó là thứ tôi đang tìm kiếm. Bên cạnh đó, không có gì sai với nó.
Alexis.Rolland

1
Pipenv có vấn đề nghiêm trọng, hãy xem cuộc thảo luận này: news.ycombinator.com/item?id=18612590
Justin M. Keyes

360

Bạn có thể sử dụng mã sau đây để tạo tệp tests.txt:

pip install pipreqs

pipreqs /path/to/project

thêm thông tin liên quan đến pipreqs có thể được tìm thấy ở đây .

Đôi khi bạn tình cờ gặp pip freeze, nhưng điều này sẽ lưu tất cả các gói trong môi trường bao gồm cả những gói bạn không sử dụng trong dự án hiện tại của mình.


1
@IgorBarinov là một Cảnh báo và sẽ không tạo ra sự cố để chạy pipreqs, tôi đã cài đặt nó trên python 2.6 và nhận được cảnh báo tương tự nhưng nó tạo ra một requirements.txttệp, cảm ơn @DJanssens
Shaikhul

1
@Shaikhul nếu bạn nhận được những cảnh báo này, bạn sẽ không có một tập tin đầy đủ, bạn sẽ chỉ nhận được một phần yêu cầu. Bạn có thể kiểm tra nó trên github.com/npow/MemNN/tree/hyperopt repo. Tôi chỉ có 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor Barinov

1
đã nói it is strongly recommended to upgrade to a newer Python version
Shaikhul

2
Công cụ tuyệt vời. Cảm ơn! Tính năng mạnh mẽ của nó mà nó tạo ra chính xác các gói đã sử dụng, không giống như đóng băng pip!
Wesam Na

1
Điều này không hoạt động đối với Python 3.6, nếu định dạng đầu ra của câu lệnh in mới là uesd.
Anand CU

10

Trong trường hợp của tôi, tôi sử dụng Anaconda, do đó, việc chạy lệnh sau từ thiết bị đầu cuối conda trong môi trường của tôi đã giải quyết nó và tự động tạo tệp txt yêu cầu này cho tôi:

conda list -e > requirements.txt

Điều này đã được lấy từ liên kết Github pratos / condaenv.txt này

Nếu thấy lỗi và bạn đang sử dụng anaconda, hãy thử sử dụng tùy chọn .yml:

conda env export > <environment-name>.yml

Để người khác sử dụng môi trường ... Hoặc nếu bạn đang tạo môi trường mới trên máy khác: conda env tạo -f .yml

tùy chọn .yml đã được tìm thấy ở đây


nếu bạn không sử dụng môi trường ảo, điều này sẽ tạo tệp yêu cầu quá dài
SBFRF

1
Điều này thực sự làm việc? Bất cứ khi nào tôi đã thử điều này, có những phụ thuộc và chi tiết cú pháp pip install requirements.txttừ chối.
conner.xyz

Tôi đã tìm thấy một số lỗi khi sử dụng .txt, vì vậy chỉ cần thêm tùy chọn khác cũng hoạt động với tôi ... "Sử dụng .yml" đã đề cập ở trên.
HassanSh__3571619 ngày

5

Đảm bảo chạy pip3 cho python3.7.

pip3 freeze >> yourfile.txt

Trước khi thực hiện lệnh trên, đảm bảo bạn đã tạo một môi trường ảo.

trăn3:

pip3 install virtualenv
python3 -m venv <myenvname> 

trăn2 :

pip install virtualenv
virtualenv <myenvname>

Sau đó đặt mã nguồn của bạn vào thư mục. Nếu bạn chạy tệp python bây giờ, có thể nó sẽ không khởi chạy Nếu bạn đang sử dụng các mô-đun không phải là bản địa. Bạn có thể cài đặt các mô-đun đang chạy

pip3 install <module> or pip install <module> 

Điều này sẽ không ảnh hưởng đến bạn toàn bộ danh sách mô-đun ngoại trừ môi trường bạn đang ở.

Bây giờ bạn có thể thực thi lệnh ở trên cùng và bây giờ bạn có tệp yêu cầu chỉ chứa các mô-đun bạn đã cài đặt trong môi trường ảo. Bây giờ bạn có thể chạy lệnh ở trên cùng.

Tôi khuyên mọi người nên sử dụng môi trường vì nó làm cho mọi thứ dễ dàng hơn khi nói đến những thứ như thế này.

Hy vọng điều này sẽ giúp.


1

Nếu Đối mặt với cùng một vấn đề như của tôi tức là không phải trên môi trường ảo và muốn tests.txt cho một dự án cụ thể hoặc từ thư mục đã chọn (bao gồm cả trẻ em) và pipreqs không hỗ trợ.

Bạn có thể dùng :

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: Nó có thể có một vài thư viện bổ sung khi nó kiểm tra trên fuzzylogic.


1

Cách tốt nhất cho Python 3 là:

pip3 freeze > requirements.txt

nó làm việc cho tôi ...


0

nếu bạn đang sử dụng PyCharm, khi bạn mở hoặc sao chép dự án vào PyCharm, nó sẽ hiển thị cảnh báo và yêu cầu bạn cài đặt tất cả các gói cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.