2013-06-24 17 views
10

Python dağıtımınıza zaten pip veya easy_install yüklediğinizi varsayarak, kullanıcı dizinine kodun kendisinden gerekli bir paketi nasıl kurabilirim.Eksik bir python paketi, komut dosyasının içinden ihtiyaç duyulan şekilde nasıl yüklenir?

try: 
    import zumba 
except ImportError: 
    import pip 
    # ... do "pip install --user zumba" or throw exception <-- how? 
    import zumba 

Ne piton içinden "--user zumba yüklemek pip" yaptığını Eksik, bilmiyorum: Çözüm gibi görünmelidir yüzden pip bildiğim kadarıyla

aynı zamanda bir piton modülüdür os.system() kullanarak yapmak istediğinizde, bu başka sorunlar yaratabilir. Bunun mümkün olduğunu varsayalım

...

+1

bu çözümün nereden: http://stackoverflow.com/questions/12332975/installing-python-module-within-code –

+2

bence bu olacak bir çok kurulum komut dosyası dışında istenmeyen kodlama uygulaması. Ben (çoğu insanı tahmin edeceğim), çevremi değiştiren herhangi bir programdan hoşlanmaya/güvenmeyeceğim. Pip ve virtualenv gibi araçlar, özellikle, "kullanıcı" hangi paketin hangi sürüme yüklendiğini kontrol etmesini sağlar. Dağıtım uzmanı değil, herhangi bir paket için önkoşul gereksinimlerini listeleme imkanlarının olduğunu biliyorum. Sadece kendi kullanımınız içinse, muhtemelen bu kodun birazını tutabilirsiniz. – Joop

+0

Teşekkürler beyler, mükemmel çalışıyor. Bir not olarak, bu modül/paketler değil, bağımsız komut dosyaları için iyi bir çözümdür. – sorin

cevap

14

sayesinde ben gelip-up doğru cevap başardı @Joop için.

try: 
    import zumba 
except ImportError: 
    import pip 
    pip.main(['install', '--user', 'zumba']) 
    import zumba 

Önemli bir açıklama, bu modülün kullanıcı dizinine yükleneceği için root erişimi gerektirmeden çalışacak olmasıdır.

İkili modüller için veya derleme gerektirecekler için çalışacağından emin değilsiniz, ancak saf python modülleri için iyi bir şekilde çalışıyor.

Artık bağımsız komut dosyaları yazabilir ve bağımlılıklar hakkında endişelenmeyin.

+0

Bu, PythonAnywhere hizmetinde 'boto3 'yüklemem için çalıştı. Pip.main() tıpkı bir API sunmak yerine komut satırı aracının etrafındaki sarıcıdır. Çirkin, ama sanırım işlevsel. '--user' ekleyene kadar bir "erişim engellendi" mesajı alıyorum. –

1

Geçerli kabul edilen yanıtın olası bir uygulama adı çarpışmasıyla sonuçlanabileceğini belirtmek istedim. Uygulama ad alanından içe aktarma, size sistemde yüklü olanların tam resmini vermez.

daha iyi bir yolu olacaktır:

import pip 

packages = [package.project_name for package in pip.get_installed_distributions()] 

if 'package' not in packages: 
    pip.main(['install', 'package']) 
İlgili konular