कोड के भीतर अजगर मॉड्यूल स्थापित करना


309

मुझे अपनी स्क्रिप्ट के भीतर सीधे PyPi से एक पैकेज स्थापित करने की आवश्यकता है। हो सकता है कि कुछ मॉड्यूल या distutils( distribute, pipआदि) सुविधा है जो मुझे कुछ की तरह निष्पादित करने की अनुमति देती है pypi.install('requests')और अनुरोध मेरे virtualenv में स्थापित किए जाएंगे।


4
आप संबंधित मॉड्यूल को अपने स्वयं के पैकेज के setup.py में निर्भरता के रूप में परिभाषित क्यों नहीं करते?
एंड्रियास जंग

5
तुम्हें पता है ... जिस तरह से यह वास्तव में किया जाना चाहिए था ... लेकिन आप हमेशा os.system ("पाइप स्थापित ब्लाह") कर सकते हैं, लेकिन आपको sudo पहुंच की आवश्यकता हो सकती है ... बेहतर है कि इसे अपने सेटअप में एक निर्भरता बनाएं। py
जोरन बेस्ले

2
क्या आप यहां स्वीकृत उत्तर को बदलने पर विचार करेंगे? आयात pipकरना कभी भी एक अच्छा विचार नहीं है - केवल यह तथ्य कि इसकी सभी सामग्रियां _internal10 संस्करण से शुरू होने वाली हैं ...
एंटिटी हवाला

2
@chuwy stackoverflow.com/a/50255019/918959 <= इस एक। pip._internalआयात करने के लिए डिज़ाइन नहीं किया गया है, यह किसी अन्य प्रोग्राम में आयात किए जाने पर बिल्कुल यादृच्छिक चीजें कर सकता है।
अंती हापाला

3
@AnttiHaapala ठीक है मैंने इसे बदल दिया है। मुझे व्यक्तिगत रूप से दोनों समाधान पसंद नहीं हैं, लेकिन मैं इन दिनों अजगर से बहुत दूर हूं, इसलिए मुझे आपकी राय पर भरोसा है।
च्यूवी

जवाबों:


251

स्क्रिप्ट से पैकेज स्थापित करने का आधिकारिक रूप से अनुशंसित तरीका है, सबप्रोसेस के माध्यम से पाइप के कमांड-लाइन इंटरफ़ेस को कॉल करना। यहां प्रस्तुत अधिकांश अन्य उत्तर पाइप द्वारा समर्थित नहीं हैं । पाइप v10 के अलावा, सभी कोड pip._internalको उपयोगकर्ताओं को यह स्पष्ट करने के लिए ठीक से स्थानांतरित कर दिया गया है कि पाइप के प्रोग्रामेटिक उपयोग की अनुमति नहीं है।

sys.executableयह सुनिश्चित करने के लिए उपयोग करें कि आप pipवर्तमान रनटाइम के साथ संबंधित कॉल करेंगे ।

import subprocess
import sys

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

इसके साथ एक मुद्दा यह है कि विंडोज पर नौसिखिए उपयोगकर्ताओं के लिए, अजगर और पाइप हमेशा अपने पैट पर नहीं होते हैं, और इसलिए एक -पीडी फ़ाइल जो डबल-क्लिक की जा सकती है वह काफी सुविधाजनक होगी, जबकि एक "पाइप इंस्टॉल xxx" टिप्पणी हो सकती है। काफी मुश्किल है।
jdpipe

CalledProcessError: Command '[' C: \\ ProgramData \\ Anaconda3 \\ pythonw.exe ',' -m ',' pip ',' install ',' googleapiclient]] '' नॉन-जीरो एग्जिट स्टेटस 1. ''
parvij

381

आप कुछ का उपयोग भी कर सकते हैं जैसे:

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()कमांड लाइन पर (लेकिन एक स्ट्रिंग के बजाय सूची में एक अलग प्रविष्टि के रूप में प्रत्येक विकल्प के साथ) के विकल्प के रूप में पास करते हैं। और यह निर्दिष्ट करने के लिए कि आप पैकेज का कौन सा संस्करण चाहते हैं, कमांड लाइन पर उसी तरह करें .. जैसे:pip.main(['install', 'pip==7.1.0'])
Kaos

3
यह भी देखें stackoverflow.com/questions/6457794/… , जो दिखाता है कि केस को कैसे संभाला जाए जहां एक इंस्टाल फेल हो जाए।
पी। मायर नोर

24
from pip._internal import main as pipmainतो आप उपयोग कर सकते हैं pipmain()बस पदावनत की तरह pip.main()देखने stackoverflow.com/questions/43398961/...
Bjorks नंबर एक प्रशंसक

17
अब इसके पदावनत हो गए।
मोर्स

6
यह एक कारण के लिए पदावनत किया जाता है और अब अनुशंसित नहीं है। देख pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
एन बी

71

यदि आप pipआवश्यक पैकेज को स्थापित करने और स्थापना के बाद आयात करना चाहते हैं, तो आप इस कोड का उपयोग कर सकते हैं:

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

यदि आपने एक पैकेज को एक उपयोगकर्ता के रूप में स्थापित किया है तो आप उस समस्या का सामना कर सकते हैं जिसे आप केवल पैकेज आयात नहीं कर सकते। देखें कैसे sys.path को ताज़ा करें? अतिरिक्त जानकारी के लिए।


4
किसी भी विचार है कि पायथन 3 पर कैसे करें? imp.reload(site)मुझे मिलता हैRuntimeError: dictionary changed size during iteration
kgadek

यह पैकेज कहां स्थापित होता है, मैंने ऐसा करने के बाद, मैं ऐसा करने में सक्षम नहीं था pip uninstall <package_name>। मैं अभी भी इसे अनइंस्टॉल कर सकता हूं pip.mainलेकिन यह जानना चाहता हूं कि यह पैकेज कहां स्थापित होता है?
ईशान खरे

उत्सुक था। अगर मैं ठीक से यह काम करेगा pip install requests[security]:? मुझे यकीन नहीं था कि यह ग्लोबल्स को सही तरीके से परिभाषित करेगा।
फॉलनराइपर

4
रगड़ा हुआ। pip.mainअब काम नहीं करता है। pip.pypa.io/en/latest/user_guide/#use-pip-from-your-program
wim

23

यह काम करना चाहिए:

import subprocess

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

1
हां यह जरूर काम करना चाहिए। लेकिन मुझे लगा कि वहाँ अधिक सुरुचिपूर्ण तरीका है;) मैं थोड़ा इंतजार कर रहा हूं, हो सकता है।
18

1
@Downvoter: मेरे जवाब में क्या गलत है? इस जवाब में सभी ओपी चाहते थे। यह एक शेल का उपयोग भी नहीं करता है।
क्वांटम

13
यह मार्ग पर पहले पाइप के सही संस्करण पर निर्भर करता है। यदि उपयोगकर्ता एक वैकल्पिक पायथन इंस्टॉलेशन चला रहा है, तो पाइप मौजूदा एक के बजाय पहले एक में स्थापित होगा। ऊपर आयात आयात सही जगह पर स्थापित होगा। मैं नीचे वोट का मुकाबला करने के लिए वैसे भी उतरा।
गैरीबिशप

6
स्क्रिप्ट कैसे चल रही है इसके आधार पर आप सही पाइप को कॉल नहीं करेंगे।
नटिम

5
कॉलिंग [sys.executable, '-m', 'pip', 'install', name]यहां "सही" पाइप प्राप्त करना सुनिश्चित कर रही है।
विम

12

मैंने @ हारून के जवाब से कुछ अपवाद को जोड़ा।

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
सबप्रोसेस और पाइप का अच्छा कार्यान्वयन, यहां अधिकांश समाधानों से बेहतर है
शांतनु शेडी

3
आप रिटुनर मान की जाँच नहीं कर रहे हैं subprocess.callताकि कोड विफल हो जाए।
अंती हापाला

5

आप "install_requires" विकल्प के साथ अपने स्वयं के पैकेज के setup.py के भीतर निर्भर मॉड्यूल को परिभाषित करते हैं।

यदि आपके पैकेज को कुछ कंसोल स्क्रिप्ट उत्पन्न करने की आवश्यकता है, तो आप एक आवरण स्क्रिप्ट उत्पन्न करने के लिए "कंसोल_ स्क्रिप्ट्स" प्रविष्टि बिंदु का उपयोग कर सकते हैं जिसे 'बिन' फ़ोल्डर (जैसे आपके वर्चुअन वातावरण) के भीतर रखा जाएगा।


1
यह पायथन परियोजनाओं की निर्भरता को प्रबंधित करने का सही उत्तर और एकमात्र समझदार तरीका है। यह virtualenv, फैब्रिक, बिल्डआउट के साथ काम करेगा, आप इसे नाम दें। @Xiaomao द्वारा वर्णित विधि, भले ही ओपी ने जो पूछा हो उसका सही उत्तर देना, शुद्ध पागलपन है।
लुकास ग्रेफ

7
हालांकि यह उचित सलाह है, यह पूछे गए सवाल का जवाब नहीं देता है
कोरी गोल्डबर्ग

2
जबकि पैकेजिंग एक विषय है, बहुत सारे अन्य उपयोग के मामले हैं, उदाहरण के लिए अजगर में लिखी गई एक तैनाती स्क्रिप्ट।
फहराते हुए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.