Python paketlerini yerel dosya sistemi klasöründen pip ile virtualenv'e yükleme


346

Yerel dosya sisteminden pip kullanarak paketler kurmak mümkün müdür?

Ben çalıştırdığınız python setup.py sdistuygun tar.gz'yi yarattı benim paketi için. Bu dosya adresindeki sistemimde saklanıyor /srv/pkg/mypackage/mypackage-0.1.0.tar.gz.

Şimdi sanal bir ortamda pypi'den veya belirli bir yerel konumdan gelen paketleri kurmak istiyorum /srv/pkg.

Mümkün mü?

PS Belirtebileceğimi biliyorum pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz. Bu işe yarayacak, ama /srv/pkgben yazdıysanız pip aramak için başka bir yer olarak konumu hakkında konuşuyorum pip install mypackage.


WHL tekerleğinden setup.py olmadan bir PyPi paketi kurmak istiyordum ve Python sürümüm için doğru bir sürümü indirdikten ve kurulduktan sonra kuruldu pip install <Path-to-WHL-file>.
Wiktor Stribiżew

Yanıtlar:


136

Aradığın --find-linksseçeneğin seçenek olduğuna eminim .

Yine index.htmlde, yerel paket dizininiz için tüm paketlerin bağlantılarını listeleyen bir kukla oluşturmanız gerekebilir . Bu araç aşağıdakilere yardımcı olur:

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackageçalışmalı.
jfs

1
Yardım eder. Ve yerel bir PyPI olarak tedavi etmek için -i pip seçeneğini kullanabiliriz .
diabloneo

Eşdeğer easy_install komutueasy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughes

Bir kaynak dağıtım dosyası oluşturmak için sadece işe yaramadan önce proje veya paket dizinine işaret etmek zorunda kaldı. Bu beni harekete geçirdi. docs.python.org/3.6/distutils/sourcedist.html
Josh

3
--find-linksPaket belirtilen konumda bulunmazsa veya daha yeni bir sürüm mevcutsa, PyPI üzerinde arama yapmaya devam edeceğini unutmayın . Windows'da, bunu --only-binary=packagename(veya --only-binary=:all:) ile birleştirmenin olağanüstü yararlı olduğunu düşünüyorum. Bu, pip'in yerel bağımlılıklara sahip olan ve PyPI üzerinde kaynak dağıtımları olan (ve böylece derleme gerektiren) herhangi bir paketi indirmeye çalışmasını önler, bu da bir dizinden yüklemeye çalışmamın en yaygın nedenidir. Bunun aksine --no-index, PyPI'den başka paketler de yükleyebilirim .
jpmc26

463

Ne dersin::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

Örneğin, pip install -e /srv/pkg

burada / srv / pkg, 'setup.py' dosyasının bulunabileceği en üst düzey dizindir.


49
Bu, paketi geliştirme modunda kuracaktır, yani sadece kaynakların bulunduğu yere geri bağlanacaktır. Herhangi bir şansla kaynaklar taşınır veya silinirse, paketi içe aktarma başarısız olur.
Trasplazio Garzuglio

3
@MarcoDinacci İlginç olan şey --editable, yerel paketin dizinine bakmak ve bir klasör varsa kaynağı git repo olarak ayarlamak gibi görünüyor - bir klasörden biraz daha esnek. Ancak bunun için belge bulamıyorum.
NotSimon

3
Bu, özellikle yerel bir makinede veya VCS url'sinde mevcut / yoğun geliştirmedeki belirli bir paketi yüklemek için doğru olsa da. Belirli bir paket kaynağının aksine, tüm yerel paket kaynakları için bir üst dizinde arama sorusuna cevap vermez . Kabul edilen yanıt, pip yüklemek istediğiniz birden fazla pakete sahip bir dizininiz veya URL'niz olduğunda çalışır.
Gavin

@MarcoDinacci Ancak, bir kullanıcının kodu indirdiğini varsayalım. O kadar zeki iseler, programın olmasını istedikleri yere koydular. Neden taşımak istiyorlar?
Zelphir Kaltstahl

1
@Simon pip'e git repo'yu aramamasını söylemenin bir yolu var mı? Ben ise do pip install -eo uzak git den kodunu kontrol eder, ben (kumandasına henüz değişikliklerle) olduğu gibi kodu yüklemek istiyorum.
Pedru

39

Ben yüklediğim pyfuzzyama PyPI değil ise; iletiyi döndürür: No matching distribution found for pyfuzzy.

Kabul edilen cevabı denedim

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

Ancak bu da çalışmaz ve aşağıdaki hatayı döndürür:

Dizinleri yoksayma : https://pypi.python.org/simple Pyfuzzy toplama Pyfuzzy gereksinimini karşılayan bir sürüm bulunamadı (versiyonlardan:) pyfuzzy için eşleşen dağıtım bulunamadı

Sonunda, orada basit bir iyi yol buldum: https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

Bu yüzden aşağıdaki komut benim için çalıştı:

pip install ../pyfuzzy-0.1.0.tar.gz.

Umarım size yardımcı olabilir.


4
Bu benim için çalıştı. Diğer yaklaşımları denedim ve Could not find a version that satisfiesyanlışlıkla tökezledim . Teşekkürler.
Rair

21

Ben kullanarak sona çözüm budur:

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

Ben bu parçalı birlikte pip örneklerini yüklemek yanı sıra gelen Rikard cevabı üzerine başka bir soru . "--Pre" argümanı üretim dışı sürümleri kurmanıza izin verir. "--No-index" bağımsız değişkeni, PyPI dizinlerini aramayı önler. "--Find-links =." argüman yerel klasörde arama yapar (bu göreceli veya mutlak olabilir). Hata ayıklamak için "--log-file", "log.txt" ve "-vv" bağımsız değişkenlerini kullandım. "--Upgrade" bağımsız değişkeni, eski sürümlerin üzerine yeni sürümler yüklemenize olanak tanır.

Bunları kaldırmak için de iyi bir yol buldum. Bu, birkaç farklı Python ortamınız olduğunda kullanışlıdır. İstenmeyen yüklemeleri önlemek için bir güvenlik önlemi ile yalnızca "install" yerine "uninstall" kullanan aynı temel biçimdir:

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

Yerel klasör şu dosyaları içerir: install.py, uninstall.py, mypackagename-1.0.zip


1
Teşekkürler. "--Find-links =." ve "--no-index", burada yardımcı program paketimin içindeki bir python betiğini yapıştırmada kullanılan anahtar, eski sürüm paketini site paketlerinden kaldırır ve ardından bir alt dizinden tar.gz'ed paketi yükler yardımcı programı paketi klasörünün Tüm plumbum ve tıklama ile otomatik. Birisi isterse bir bağlantı gönderirim. Upvoted.
JackLeEmmerdeur

15

Bir seçenek --find-links işi yapar ve requirements.txtdosyadan çalışır !

Paket arşivlerini bir klasöre koyabilir ve gereksinimler dosyasını değiştirmeden en sonuncuyu alabilirsiniz, örneğin requirements:

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

Şimdi requirements/base.txtkoymak:

--find-links=requirements
foo_bar
wiz_bang>=0.8

Tescilli paketleri güncellemenin düzgün bir yolu, klasöre yeni bir tane bırakmanız yeterli

Bu şekilde gelen paketleri yükleyebilir local folderVE pypiaynı tek çağrıyla:pip install -r requirements/production.txt

PS. Benim Bkz cookiecutter-djangopackage dayalı ihtiyaçlar örgütün klasör gereksinimleri ve kullanımını bölmek nasıl olduğunu görmek için çatal.


Teşekkürler, bu benim yapmayı düşündüğümden bile daha iyi!
FoundNil

12

Gönderen yükleme-paketleri sayfasından basitçe çalıştırabilirsiniz:

pip install / srv / pkg / paketim

Burada / srv / pkg / mypackage , setup.py dosyasını içeren dizindir .


Ayrıca 1 , arşiv dosyasından yükleyebilirsiniz:

pip install ./mypackage-1.0.4.tar.gz

1 Soruda belirtilmesine rağmen, popülaritesi nedeniyle de dahil edilmiştir.


2
Bu varsayılan cevap olmalıdır. Paketinizin yerel makinede tam olarak nerede olduğunu biliyorsanız --find-links ile pip avına gerek yoktur.
Robert

6

Virtualenv'iniz ve bir requirements.txtdosyanız olduğunu varsayarsak , bu dosyanın içinde paketleri nereden alacağınızı tanımlayabilirsiniz:

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

requirements.txtVe içinde gereksinimleri olmasıegg_dirDizin dizin olarak

yerel önbelleğinizi oluşturabilirsiniz:

$ pip download -r requirements.txt -d eggs_dir

o zaman, bu "önbellek" kullanımı basittir:

$ pip install -r requirements.txt --find-links=eggs_dir


1

Yalnızca yerelden yüklemek için 2 seçeneğe ihtiyacınız vardır:

  • --find-links: bağımlılıkların nereye bakılacağı. file://Başkaları tarafından belirtilen önek gerekmez .
  • --no-index: eksik bağımlılıklar için pypi dizinlerine bakmayın (bağımlılıklar yüklü değil ve --find-linksyolda değil ).

Böylece herhangi bir klasörden aşağıdakileri çalıştırabilirsiniz:

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

Mypackage düzgün bir şekilde ayarlandıysa, tüm bağımlılıklarını listeler ve bağımlılıkları (yani, bağımlılık bağımlılıkları vb.) Kaskadını indirmek için pip download kullandıysanız, her şey işe yarayacaktır.

Erişilebilirse pypi dizinini kullanmak istiyorsanız, ancak yerel tekerleklere geri dönüş yapıyorsanız, kaldırabilir --no-indexve ekleyebilirsiniz --retries 0. Pypi'yi eksik bir bağımlılık (yüklü değil) için kontrol etmeye çalışırken bir süre pip duraklaması göreceksiniz ve ulaşamadığı zaman yerele geri dönecektir. Pip'e "önce yerel olanları, sonra dizini arayın" demenin bir yolu yok gibi görünüyor.


-1

Gerçekten basit ve sefil bir şey başarmaya çalışıyorum, muhtemelen aptalım.

Her neyse, bir komut dosyanız varsa / Dockerfilebir python paketi zip dosyası indiriyorsa (örneğin, GitHub'dan) ve daha sonra yüklemek istiyorsanız file:///, aşağıdaki örnekte gösterildiği gibi yüklemek için öneki kullanabilirsiniz :

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

NOT : Paketi kullanarak hemen yükleyebilirsiniz biliyorum pip install https://example.com/mypackage.zipama benim durumumda sağlama toplamı (asla yeterince paranoyak) doğrulamak istedim ve pip çeşitli seçenekleri / #md5parça kullanmaya çalışırken perişan başarısız oldu .

Doğrudan bu kadar basit bir şey yapmak şaşırtıcı derecede sinir bozucu oldu pip. Ben sadece bir sağlama toplamı geçmek ve yüklemeden öncepip zip eşleşen olduğunu doğrulamak istedim .

Muhtemelen çok aptalca bir şey yapıyordum ama sonunda vazgeçtim ve bunu seçtim. Umarım başkalarına benzer bir şey yapmaya çalışır.

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.