سؤال

ما هو وسيلة جيدة للتحقق ما إذا كان يتم تثبيت حزمة بينما في بيثون السيناريو ؟ أعلم أنه من السهل مترجم, ولكن أنا بحاجة إلى أن تفعل ذلك في غضون النصي.

أعتقد أنني يمكن أن تحقق إذا كان هناك دليل على النظام الذي تم إنشاؤه أثناء التثبيت, ولكن أشعر أن هناك طريقة أفضل.أنا أحاول أن تأكد Skype4Py تثبيت حزمة, وإذا لم يكن سوف تثبيته.

أفكاري عن إنجاز تحقق

  • تحقق من دليل في نموذجية تثبيت المسار
  • محاولة استيراد حزمة وإذا استثناء رمي ، ثم تثبيت حزمة
هل كانت مفيدة؟

المحلول

إذا كنت تقصد بيثون السيناريو فقط أن تفعل شيئا مثل هذا:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.

نصائح أخرى

تحديث الإجابة

أفضل طريقة للقيام بذلك هو:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

النتيجة:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

تحقق مما إذا كان requests مثبت:

if 'requests' in installed_packages:
    # Do something

لماذا هذه الطريقة ؟ في بعض الأحيان لديك التطبيق اسم التصادم.استيراد من التطبيق مساحة لا تعطيك صورة كاملة عن ما هو مثبت على النظام.

القديمة الإجابة

أفضل طريقة للقيام بذلك هو:

import pip
installed_packages = pip.get_installed_distributions()

على بيب>=10.× استخدام:

from pip._internal.utils.misc import get_installed_distributions

لماذا هذه الطريقة ؟ في بعض الأحيان لديك التطبيق اسم التصادم.استيراد من التطبيق مساحة لا تعطيك صورة كاملة عن ما هو مثبت على النظام.

ونتيجة لذلك ، يمكنك الحصول على قائمة من pkg_resources.Distribution الكائنات.ترى التالية كمثال:

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

تقديم قائمة من ذلك:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

تحقق مما إذا كان requests مثبت:

if 'requests' in flat_installed_packages:
    # Do something

كما الثعبان 3.3 يمكنك استخدام find_spec() طريقة

import importlib.util
import sys

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")

إذا كنت تريد أن يكون الاختيار من المحطة ، يمكنك تشغيل

pip3 show package_name

و إذا كان لا يتم إرجاع الحزمة لم يتم تثبيت.

إذا ربما كنت ترغب في أتمتة هذا الاختيار ، بحيث على سبيل المثال يمكنك تثبيته إذا مفقود ، هل يمكن أن يكون ما يلي باش النصي:

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi

امتدادا هذا الجواب:

بايثون 2.*, pip show <package_name> سوف تؤدي نفس المهمة.

على سبيل المثال pip show numpy سيعود التالية أو على حد سواء:

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires: 
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy

يمكنك استخدام pkg_resources وحدة من setuptools.على سبيل المثال:

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

لاحظ أن هناك فرق بين بيثون وحدة بيثون الحزمة.مجموعة يمكن أن تحتوي على وحدات متعددة وحدة أسماء قد لا تطابق اسم حزمة.

أود أن أضيف بعض الأفكار/نتائج الألغام إلى هذا الموضوع.أنا أكتب السيناريو أن يتحقق كل متطلبات العرف البرنامج.هناك العديد من الشيكات مع بيثون وحدات جدا.

هناك مشكلة صغيرة مع

try:
   import ..
except:
   ..

الحل.في حالة واحدة من بيثون وحدات تسمى python-nmap, لكن استيراد مع import nmap و كما ترون أسماء تطابق.ولذلك الاختبار مع الحل أعلاه بإرجاع نتيجة خاطئة ، كما أن الواردات وحدة على ضرب ولكن ربما لا تحتاج إلى استخدام الكثير من الذاكرة لاختبار بسيط/check.

كما أنني وجدت أن

import pip
installed_packages = pip.get_installed_distributions()

installed_packages سوف يكون فقط حزم وقد تثبيت مع بيب.على نظام بلدي pip freeze يعود أكثر 40 بيثون وحدات installed_packages فقط 1, أنا تثبيت يدويا (الثعبان-nmap).

حل آخر دون أن أعرف ذلك قد لا ذات الصلة, لكن أعتقد أنها ممارسة جيدة أن الحفاظ على اختبار وظيفة منفصلة من الذي ينفذ تثبيته قد يكون من المفيد لبعض.

الحل التي عملت بالنسبة لي.فإنه بناء على هذه الإجابة كيفية التحقق إذا بيثون وحدة موجودا دون استيراده

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

ملاحظة:هذا الحل لا يمكن العثور على وحدة اسمها python-nmap أيضا لا بد لي من استخدام nmap بدلا (من السهل العيش مع) ولكن في هذه الحالة وحدة لا يتم تحميلها إلى ذاكرة على الإطلاق.

إذا كنت ترغب في السيناريو الخاص بك لتثبيت حزم المفقودة والاستمرار, هل يمكن أن تفعل شيئا مثل هذا (على سبيل المثال 'krbV وحدة في python-krbV' حزمة):

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))

طريقة سريعة لاستخدام بيثون أداة سطر الأوامر.ببساطة اكتب import <your module name> كنت ترى خطأ إذا وحدة في عداد المفقودين.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$

انتقل الخيار #2.إذا ImportError يتم طرح ، ثم حزمة غير مثبتة (أو لا sys.path).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top