สร้าง requirements.txt โดยอัตโนมัติ


277

บางครั้งฉันดาวน์โหลดซอร์สโค้ดหลามจากgithubและไม่รู้วิธีติดตั้งการพึ่งพาทั้งหมด หากไม่มีrequirements.txtไฟล์ฉันต้องสร้างมันด้วยมือ คำถามคือ: กำหนดไดเรกทอรีซอร์สของไพ ธ อนมันเป็นไปได้ที่จะสร้างrequirements.txtโดยอัตโนมัติจากส่วนนำเข้าหรือไม่?


2
คุณสามารถทำได้โดยการเรียกใช้pip freeze > requirements.txtจะบันทึกไลบรารีหลามทั้งหมดของคุณด้วยเวอร์ชันปัจจุบันลงในrequirements.txtไฟล์
Shaikhul

7
@Shaikhul แต่นั่นไม่ได้ช่วยในกรณีที่คุณไม่ได้ติดตั้งการอ้างอิงเพราะคุณเพิ่งดาวน์โหลดแพคเกจจาก GitHub ...
jonrsharpe

8
โปรดทราบ: a) pip freezeจะถ่ายโอนข้อมูลรุ่นallที่ติดตั้งอยู่ในระบบปัจจุบันโดยไม่คำนึงถึงการใช้งานในโครงการปัจจุบัน b) pip จะแสดงเฉพาะโมดูลที่ติดตั้งผ่าน pip
akskap

เป็นไปได้ที่ซ้ำกันของวิธีการสร้าง.txtข้อกำหนด?
Daniel Santos

คำตอบ:


290

หากคุณใช้สภาพแวดล้อมเสมือนจริงpip freeze > requirements.txtเพียงแค่ปรับ ถ้าไม่เช่นนั้นpigarจะเป็นตัวเลือกที่ดีสำหรับคุณ

โดยวิธีการที่ฉันไม่แน่ใจว่ามันจะทำงานร่วมกับ 2.6

อัปเดต :

แนะนำให้ใช้Pipenvหรือเครื่องมืออื่น ๆ เพื่อปรับปรุงกระบวนการพัฒนาของคุณ

สำหรับPython 3ใช้ด้านล่าง

pip3 freeze > requirements.txt

3
สำหรับข้อผิดพลาดทุกคนฉันขอแนะนำให้ลองpip3 freeze > requirements.txtก่อนถามคำถาม
baranskistad

3
ผมดำเนินการpip3 freeze > requirements.txtและฉันประหลาดใจที่ไม่พบแพคเกจบางอย่างที่ฉันกำลังใช้จริงเช่นและargparse configparserเป็นเพราะพวกเขาเป็นส่วนหนึ่งของ Python core หรือไม่? ฉันเชื่อว่าคำตอบที่ดีกว่าคือใช้pipreqsด้านล่างเพราะจะแสดงรายการข้อกำหนดที่โครงการของคุณใช้เท่านั้น
Alexis.Rolland

@ Alexis.Rolland ใช่แล้วargparseและconfigparserเป็นของ Python3 standard library ดังนั้นมีอะไรผิดปกติpip3 freeze? ฉันไม่เข้าใจคุณ
ว่า

11
@damnever ตกลงขอบคุณ! pip3 freezeให้รายชื่อแพ็กเกจ Python ทั้งหมดที่ฉันติดตั้งในสภาพแวดล้อมของฉันในขณะที่pipreqsให้ทุกอย่างที่ใช้ในซอร์สโค้ดของฉันซึ่งเป็นสิ่งที่ฉันกำลังมองหา นอกจากนั้นไม่มีอะไรผิดปกติกับมัน
Alexis.Rolland

1
pipenv มีปัญหาร้ายแรงดูการสนทนานี้: news.ycombinator.com/item?id=18612590
Justin M. Keyes

364

คุณสามารถใช้รหัสต่อไปนี้เพื่อสร้างไฟล์ requirements.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'
Igor Barinov

1
ที่กล่าวว่า it is strongly recommended to upgrade to a newer Python version
Shaikhul

2
เครื่องมือที่ยอดเยี่ยม ขอบคุณ! คุณสมบัติอันทรงพลังของมันที่สร้างขึ้นอย่างแน่นอนว่าแพ็คเกจที่ใช้แล้วไม่เหมือนกับ pip freeze!
Wesam Na

1
สิ่งนี้ใช้ไม่ได้กับ Python 3.6 หากการจัดรูปแบบเอาต์พุตคำสั่งพิมพ์ใหม่เป็น uesd
Anand CU

12

ในกรณีของฉันฉันใช้ Anaconda ดังนั้นการรันคำสั่งต่อไปนี้จาก conda terminal ภายในสภาพแวดล้อมของฉันจะแก้ไขและสร้างไฟล์ 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 ดังนั้นเพียงเพิ่มตัวเลือกอื่นที่ทำงานกับฉันด้วย ... "การใช้. syml" ที่กล่าวถึงข้างต้น
HassanSh__3571619

5

ตรวจสอบให้แน่ใจว่าเรียกใช้ pip3 สำหรับ python3.7

pip3 freeze >> yourfile.txt

ก่อนดำเนินการคำสั่งด้านบนตรวจสอบให้แน่ใจว่าคุณได้สร้างสภาพแวดล้อมเสมือนจริง

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

หลาม 2 :

pip install virtualenv
virtualenv <myenvname>

หลังจากนั้นให้ใส่ซอร์สโค้ดของคุณลงในไดเรกทอรี หากคุณเรียกใช้ไฟล์ไพ ธ อนตอนนี้อาจเป็นไปได้ว่ามันจะไม่เริ่มทำงานหากคุณใช้โมดูลที่ไม่ใช่เจ้าของภาษา คุณสามารถติดตั้งโมดูลเหล่านั้นทำงาน

pip3 install <module> or pip install <module> 

สิ่งนี้จะไม่มีผลกับรายการโมดูลทั้งหมดยกเว้นสภาพแวดล้อมที่คุณอยู่

ตอนนี้คุณสามารถรันคำสั่งที่ด้านบนและตอนนี้คุณมีไฟล์ข้อกำหนดที่มีเฉพาะโมดูลที่คุณติดตั้งในสภาพแวดล้อมเสมือน ตอนนี้คุณสามารถเรียกใช้คำสั่งที่ด้านบน

ฉันแนะนำให้ทุกคนใช้สภาพแวดล้อมเพราะจะทำให้สิ่งต่าง ๆ ง่ายขึ้นเมื่อพูดถึงสิ่งนี้

หวังว่านี่จะช่วยได้


1

หากประสบปัญหาเช่นเดียวกับของฉันเช่นไม่ได้อยู่ในสภาพแวดล้อมเสมือนจริงและต้องการ requirements.txt สำหรับโครงการที่เฉพาะเจาะจงหรือจากโฟลเดอร์ที่เลือก (รวมถึงเด็ก ๆ )และ pipreq ไม่รองรับ

คุณสามารถใช้ได้ :

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: มันอาจมีห้องสมุดเพิ่มเติมไม่กี่แห่งที่ตรวจสอบ fuzzylogic


1

วิธีที่ดีที่สุดสำหรับ Python 3 คือ:

pip3 freeze > requirements.txt

มันทำงานให้ฉัน ...


0

หากคุณใช้ PyCharm เมื่อคุณเปิดหรือโคลนโครงการใน PyCharm จะแสดงการแจ้งเตือนและขอให้คุณติดตั้งแพ็คเกจที่จำเป็นทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.