Kod içinde python modülünün kurulması


310

Komut dosyamda PyPi'den bir paket kurmam gerekiyor. Belki sadece böyle bir şeyi yürütmeme izin veren bazı modül veya distutils( distribute, pipvb.) Özelliği var pypi.install('requests')ve sanal sanalma istekler yüklenecek.


4
İlgili modülü neden kendi paketinizin setup.py dosyasında bağımlılık olarak tanımlamıyorsunuz?
Andreas Jung

5
biliyorsunuz ... aslında yapılması gereken şey ... ama her zaman os.system ("pip install blah") olabilir ama sudo erişimine ihtiyacınız olabilir ... sadece kurulumunuzda bir bağımlılık yapmak daha iyi. py
Joran Beasley

2
Burada kabul edilen cevabı değiştirmeyi düşünür müsünüz? İçe aktarma pipasla iyi bir fikir değildir - tüm içeriğinin _internalsürüm 10'dan itibaren olması ...
Antti Haapala

2
@chuwy stackoverflow.com/a/50255019/918959 <= bu. pip._internalithal edilebilir olarak tasarlanmamıştır, başka bir programa içe aktarıldığında kesinlikle rastgele şeyler yapabilir.
Antti Haapala

3
@AnttiHaapala tamam değiştirdim. Şahsen her iki çözümü de sevmiyorum, ama bugünlerde Python'dan uzaktayım, bu yüzden fikrinize güveniyorum.
chuwy

Yanıtlar:


253

Bir komut dosyasından paketleri kurmanın resmi olarak önerilen yolu, pip'in komut satırı arabirimini bir alt işlemle çağırmaktır. Burada sunulan diğer cevapların çoğu pip tarafından desteklenmez . Ayrıca pip v10'dan beri, pip._internalkullanıcılara pip'in programlı kullanımına izin verilmediğini açıkça belirtmek için tüm kodlar tam olarak taşınmıştır .

Geçerli çalışma zamanı ile ilişkilendirilmiş olanın sys.executableaynısını arayacağınızdan emin olmak için kullanın pip.

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

Bununla ilgili bir sorun, Windows'taki acemi kullanıcılar için, python ve pip her zaman PATH'larında değildir ve bu nedenle çift tıklanabilecek bir .py dosyası oldukça kullanışlı olurken, "pip install xxx" yorumu oldukça zor.
jdpipe

CalledProcessError: '[' C: \\ ProgramData \\ Anaconda3 \\ pythonw.exe ',' -m ',' pip ',' install ',' googleapiclient ']' sıfır olmayan çıkış durumu 1 döndürdü.
parvij

383

Ayrıca şöyle bir şey kullanabilirsiniz:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')

3
@nbro pip.main(), komut satırında olduğu gibi seçenekleri iletirsiniz (ancak her seçenekle birlikte tek bir dize yerine ayrı bir giriş olarak). : Ve komut satırında .. ex olduğu gibi aynı şeyi hangi istediğiniz paketin versiyonu belirtmek içinpip.main(['install', 'pip==7.1.0'])
Kaos

3
Ayrıca , bir yüklemenin başarısız olduğu durumun nasıl ele alınacağını gösteren stackoverflow.com/questions/6457794/… adresine bakın .
P. Myer Nore

25
from pip._internal import main as pipmaino zaman kullanabilirsiniz pipmain()sadece kullanımdan kaldırılmış gibi pip.main()bkz stackoverflow.com/questions/43398961/...
Bjorks numaralı hayranıyım

17
artık reddedildi.
Morse

6
Bir nedenden dolayı kullanımdan kaldırıldı ve artık önerilmiyor. bkz. pip.pypa.io/tr/latest/user_guide/#using-pip-from-your-program
NBK

71

Kullanmak isterseniz pipgerekli paket kurulması ve kurulum sonunda ithal ettiğini, bu kodu kullanabilirsiniz:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

Bir paketi kullanıcı olarak yüklediyseniz, paketi içe aktaramayacağınız bir sorunla karşılaşabilirsiniz. Bkz. Sys.path nasıl yenilenir? Ek bilgi için.


4
Python 3'te bunu nasıl yapacağınız hakkında bir fikriniz var mı? imp.reload(site)beni alırRuntimeError: dictionary changed size during iteration
kgadek

Bu paketi nereye yüklüyor, bunu yaptıktan sonra yapamadım pip uninstall <package_name>. Yine de kullanarak kaldırabilirim pip.mainama sadece paketi nereye yüklediğini bilmek istedim?
Ishan Khare

Merak ediyordum. Yaparsam bu düzgün çalışır pip install requests[security]mı? Küreselleri doğru bir şekilde tanımlayıp tanımlamayacağından emin değildim.
Fallenreaper

4
Demode. pip.mainArtık çalışmıyor. pip.pypa.io/tr/latest/user_guide/#using-pip-from-your-program
wim

23

Bu çalışmalı:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

1
Evet kesinlikle işe yaramalı. Ama daha zarif bir yol olduğunu düşündüm;) Biraz bekleyeceğim, olabilir.
chuwy

1
@Downvoter: Cevabımdaki sorun tam olarak nedir? Bu cevap OP'nin istediği her şeye sahip. Bir kabuk bile kullanmıyor.
kuantum

13
Bu, yolda ilk sırada olan pip'in doğru sürümüne bağlıdır. Kullanıcı alternatif bir python yüklemesi çalıştırıyorsa, pip geçerli olanın yerine ilkine yüklenir. Yukarıdaki ithalat yaklaşımı doğru yere kurulacaktır. Ben aşağı oy için karşı zaten oy verdim.
GaryBishop

6
Senaryonun nasıl çalıştığına bağlı olarak doğru pip çağırmayacaksınız.
Natim

5
Arama [sys.executable, '-m', 'pip', 'install', name]burada "doğru" pip almak emin olmaktır.
wim

12

@ Aaron'ın cevabına bazı istisna işlemleri ekledim.

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

1
alt süreç ve pip güzel uygulama, burada çoğu çözüm daha iyi
Shantanu Shady

3
subprocess.callKodun başarısız olabilmesi için retunr değerini kontrol etmiyorsunuz .
Antti Haapala

5

Bağımlı modülü kendi paketinizin setup.py içinde "install_requires" seçeneğiyle tanımlarsınız.

Paketinizde bazı konsol komut dosyalarının oluşturulması gerekiyorsa, 'bin' klasörüne (örn. Virtualenv ortamınız) yerleştirilecek bir sarıcı komut dosyası oluşturmak için "console_scripts" giriş noktasını kullanabilirsiniz.


1
Bu doğru yanıttır ve bir Python projesinin bağımlılıklarını yönetmenin tek mantıklı yoludur. Virtualenv, Fabric, buildout ile çalışacak, siz adlandırın. @ Xiaomao tarafından tarif edilen yöntem, OP'nin tam olarak sorduğu soruya cevap vermesine rağmen, saf delilik.
Lukas Graf

7
bu doğru bir tavsiye olsa da, sorulan soruya cevap vermez
Corey Goldberg

2
Paketleme bir konu olsa da, python ile yazılmış bir dağıtım betiği gibi birçok başka kullanım durumu vardır.
hoefling
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.