Otomatik olarak gereksinimler oluşturun.txt


277

Bazen python kaynak kodunu indiriyorum githubve tüm bağımlılıkları nasıl yükleyeceğimi bilmiyorum. requirements.txtDosya yoksa, bunları elle oluşturmak zorundayım. Soru şudur: Python kaynak kodu dizini göz önüne alındığında requirements.txt, içe aktarma bölümünden otomatik olarak oluşturmak mümkün mü?


2
Sen koşu ile yapabilirsiniz pip freeze > requirements.txtiçine geçerli sürümü ile tüm piton kütüphaneleri kurtaracak requirements.txtdosyası
Shaikhul

7
@Shaikhul, ancak bağımlılıkları yüklemediğiniz durumda işe yaramıyor çünkü paketi sadece GitHub'dan
indirdiniz

8
Lütfen dikkat: a) mevcut projede kullanımdan bağımsız olarak, kurulu modüllerin pip freezemevcut sürümlerini allbu sisteme dökecektir. b) pip sadece pip üzerinden takılmış olan modülleri listeler
akskap

Yanıtlar:


290

Sanal ortam kullanıyorsanız, pip freeze > requirements.txtgayet iyi. IF NOT , pigar sizin için iyi bir seçim olacaktır.

Bu arada, 2.6 ile çalışacağından emin değilim.

GÜNCELLEME :

Geliştirme akışınızı iyileştirmek için Pipenv veya diğer araçlar önerilir.

İçin Python 3 aşağıdan

pip3 freeze > requirements.txt

3
Hata yapan herkes için, pip3 freeze > requirements.txtbir soru sormadan önce denemenizi öneririz .
baranskistad

3
Yürütüyorum pip3 freeze > requirements.txtve aslında argparseve gibi kullandığım bazı paketleri bulamadığım için şaşırdım configparser. Python çekirdeğinin bir parçası oldukları için mi? Daha iyi bir cevabın pipreqsaşağıda kullanmak olduğuna inanıyorum çünkü sadece projenizin kullandığı gereksinimleri listeleyecektir.
Alexis.Rolland

@ Alexis.Rolland Evet, argparseve configparserPython3 standart kütüphanesine aittir, bu nedenle, ne yanlış pip3 freeze? Ne demek istediğini anlamıyorum.
lanet olsun

11
@damnever Tamam teşekkürler! pip3 freezebana ortamımda yüklü olan tüm Python paketlerinin listesini verirken pipreqs, kaynak kodumda kullanılanları aradığım şeydir. Bunun yanında, hiçbir şey yanlış değil.
Alexis.Rolland

1
pipenv'in ciddi sorunları var, bu tartışmaya bakın: news.ycombinator.com/item?id=18612590
Justin M. Keyes

364

Needs.txt dosyası oluşturmak için aşağıdaki kodu kullanabilirsiniz:

pip install pipreqs

pipreqs /path/to/project

pipreqs ile ilgili daha fazla bilgiyi burada bulabilirsiniz .

Bazen karşılaşırsınız pip freeze, ancak bu, mevcut projenizde kullanmadığınız paketler de dahil olmak üzere ortamdaki tüm paketleri kaydeder.


1
@IgorBarinov bu bir Uyarı ve çalıştırmak için bir sorun oluşturmaz pipreqs, python 2.6 üzerine yükledim ve aynı uyarıyı aldım, ancak bir requirements.txtdosya oluşturur , teşekkürler @DJanssens
Shaikhul

1
@Shaikhul bu uyarıları alırsanız tam bir dosyaya sahip olmayacaksınız, sadece gereksinimlerin bir kısmını alacaksınız. Bunu github.com/npow/MemNN/tree/hyperopt repo adresinden kontrol edebilirsiniz . Sadece 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0' var
Igor Barinov

1
dedi ki it is strongly recommended to upgrade to a newer Python version
Shaikhul

2
Harika bir araç. Teşekkürler! Pip donması gibi değil, tam olarak kullanılan paketleri üretmesinin güçlü özelliği!
Wesam Na

1
Yeni baskı deyimi çıktı biçimlendirmesi uesd ise, bu Python 3.6 için çalışmaz.
Anand CU

12

Benim durumumda, Anaconda kullanıyorum, bu yüzden ortamımdaki conda terminalinden aşağıdaki komutu çalıştırmak onu çözdü ve bu gereksinimleri txt dosyasını benim için otomatik olarak yarattı:

conda list -e > requirements.txt

Bu, bu Github bağlantısı pratos / condaenv.txt'den alınmıştır.

Bir hata görüldüyse ve anaconda kullanıyorsanız, .yml seçeneğini kullanmayı deneyin:

conda env export > <environment-name>.yml

Başka bir kişinin çevreyi kullanması için ... Veya başka bir makinede yeni bir çevre oluşturuyorsanız: conda env create -f .yml

.yml seçeneği burada bulundu


sanal bir ortam kullanmıyorsanız, bu aşırı uzun bir gereksinim
yaratır. txt

1
Bu gerçekten işe yarıyor mu? Bunu denediğimde, pip install requirements.txtreddedilen bağımlılıklar ve sözdizimi özellikleri vardır .
conner.xyz

Ben .txt kullanarak bazı hatalar buldum, bu yüzden sadece benimle de çalışan diğer seçeneği ekledi ... "Yukarıda belirtilen .yml kullanma".
HassanSh__3571619

5

Python3.7 için pip3'ü çalıştırdığınızdan emin olun.

pip3 freeze >> yourfile.txt

Yukarıdaki komutu çalıştırmadan önce bir sanal ortam oluşturduğunuzdan emin olun.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Bundan sonra kaynak kodunuzu dizine koyun. Python dosyasını şimdi çalıştırırsanız, Yerel olmayan modüller kullanıyorsanız, muhtemelen başlamaz. Bu modülleri çalıştırabilirsiniz

pip3 install <module> or pip install <module> 

Bu, bulunduğunuz ortam haricinde tüm modül listenizi etkilemez.

Şimdi komutu en üstte yürütebilirsiniz ve şimdi yalnızca sanal ortama kurduğunuz modülleri içeren bir gereksinimler dosyanız var. Şimdi üstteki komutu çalıştırabilirsiniz.

Bu gibi şeyler söz konusu olduğunda işleri kolaylaştırdığı için herkese ortamları kullanmasını öneriyorum.

Umarım bu yardımcı olmuştur.


1

Benimkiyle aynı sorunla karşılaşılıyorsa, yani sanal ortamda değil ve belirli bir proje için veya seçilen klasörden (alt öğeler dahil) ve ihtiyaçlar txt istiyorsa pipreqs desteklemiyor.

Kullanabilirsiniz :

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

Not: Bulanıklığı kontrol ettiği için birkaç ek kütüphanesi olabilir.


1

Python 3 için en iyi yol:

pip3 freeze > requirements.txt

benim için çalıştı ...


0

PyCharm kullanıyorsanız, projeyi PyCharm'a açtığınızda veya kopyaladığınızda, bir uyarı gösterir ve gerekli tüm paketleri kurmanızı ister.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.