Ubuntu 16.4 и не может найти rpy2 в системе. Как проверить, установлен ли он, поскольку ни одна из моих команд не работает [dублировать]

Поскольку вы можете попасть на консоль, возможно, проще всего попробовать сначала войти и запустить:

sudo apt-get install --fix-broken

Если проблема заключается лишь в том, что некоторые пакеты не закончили настройку, она должна иметь возможность завершить это, сеть или нет.

61
задан 24 February 2015 в 19:04

16 ответов

Вы можете поместить код внутри блока try, except.

$ python3 -c "\ try: import cow print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" There was no such module installed $ python3 -c "\ try: import regex print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" Module was installed
9
ответ дан 17 July 2018 в 22:30

Проверка оболочки oneliner (полезная для инициализации)

Я обнаружил, что для обеспечения инициализации моей инфраструктуры ** idempotent мне нужно иметь возможность проверять пакет из оболочки в oneliner. Я построил ответ на @ cuonglm. Мне пришлось отменить 1 и 0, потому что я создаю статус выхода, а не печатаю строку.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Вы можете заменить sys.argv[1] на одиночное цитированное имя вашего пакет, но для моих сценариев инициализации мне нравится читаемость в конце.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Я понимаю, что у шеф-повара, марионетки и всех есть плагины для управления пакетами python, но вы можете найти себя в такой ситуации, как я, где вы используете устаревшую версию и не хотите использовать устаревшие плагины.

1
ответ дан 17 July 2018 в 22:30

Можно также использовать pydoc modules, который можно отфильтровать с помощью grep, чтобы найти конкретный модуль. Вывод отображается в градиентном формате. Единственным недостатком этого подхода является то, что он также будет включать файлы python в текущем рабочем каталоге. Тем не менее, я использую его сам большую часть времени, и это один из высоко цитируемых подходов к этому связанному вопросу: https://stackoverflow.com/q/739993/3701431

1
ответ дан 17 July 2018 в 22:30

Другим способом является модуль pkgutil. Работает как с Python 2 & amp; 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Вам нужно заменить module на имя вашего модуля, например:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)' 1
13
ответ дан 17 July 2018 в 22:30

в качестве другого ответа, ради завершения по:

Вы можете (АБ)использовать параметр -m. Из Man-страницы на Python:

-m module-name Searches sys.path for the named module and runs the correspond‐ ing .py file as a script.

, который даст нам:

$ python2 -m numpy /sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed $ python2 -m math /sbin/python2: No code object available for math

, но для несуществующих модулей, она даст нам:

$ python2 -m doesnt_exist /sbin/python2: No module named doesnt_exist

мы могли бы использовать [F6], чтобы совпасть:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Nope $ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Yup

это немного хак-иш, а не то, что -m был предназначен для, но это метод, который требует меньше ввода, если вы хотите быстрый тест :-)

6
ответ дан 17 July 2018 в 22:30

Я написал пример в Python:

import pip import sys from bigml.api import BigML if not 'bigml' in sys.modules.keys(): pip.main(['install', 'bigml'])
2
ответ дан 17 July 2018 в 22:30

я знаю, что ОП изначально просил решение после запуска питона, но питон я использую pip. На Ubuntu: sudo apt-get install python-pip, если он еще не установлен.

затем, чтобы увидеть, какие модули сторонних разработчиков доступны, просто запустите:

pip freeze

или даже

pip list

и оба покажут Вам всех установленных модулей и их версий.

, если модуль, который вы ищете не установлен, большую часть времени вы можете легко установить его с PIP:

pip install <module-name>

если Вы не уверены, является ли модуль существует или что его PyPI имя, использовать pip search:

pip search <keyword>
8
ответ дан 17 July 2018 в 22:30

Если мы не хотим импортировать нежелательный модуль (что произойдет в инструкции try), мы можем использовать sys.modules для тестирования модулей, которые были установлены и были импортированы ранее.

В проблеме оболочки python:

>>> import sys

Затем проверьте наличие установленных модулей:

>>> 'numpy' in sys.modules True >>> 'scipy' in sys.modules False

Обратите внимание, что только те модули, которые были импортированы, перед тем, как дать True на этом test, все остальные модули (даже если они установлены) приводят к False.

. Другая альтернатива try оператора import в консоли python вызывает встроенную функцию help(). Это не даст документации для не установленных модулей, например

>>> help('scipy') no Python documentation found for 'scipy'

Вывод очень длинных справочных документов установленных модулей может быть прерван Q.

Теперь, чтобы установить отсутствующие модулей рекомендуется использовать и (а не путь Python), потому что нам нужен root-доступ, а также для предотвращения испорчения нашей сильно зависимой от Python системы. Для рассматриваемого модуля это будет, например, be:

sudo apt-get install python-scipy ## for Python2 sudo apt-get install python3-scipy ## for Python3

После установки мы можем добавить их в словарь sys.modules, импортировав их один раз.

17
ответ дан 17 July 2018 в 22:30

Вы можете поместить код внутри блока try, except.

$ python3 -c "\ try: import cow print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" There was no such module installed $ python3 -c "\ try: import regex print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" Module was installed
9
ответ дан 23 July 2018 в 23:08

оболочки, проявляющаяся проверить (полезен для подготовки)

я нашел, что для того, чтобы сделать мою подготовку инфраструктуры** идемпотентом, я должен быть в состоянии проверить для пакета из раковины в проявляющаяся. Я построил на ответ @cuonglm по. Мне пришлось отменить 1 и [F4] и потому что я создаю статус выхода, а не печатать строку.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

можно заменить на sys.argv[1] с одинарных кавычках имя вашего пакета, но для моих сценариев инициализации мне нравится читаемость его в конце.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** я понимаю, что шеф-повар, кукол, и ansible все плагины для управления пакетов Python, но вы можете найти себя в ситуации, как мне, где вы используете устаревшую версию и не хотите использовать устаревшие плагины.

1
ответ дан 23 July 2018 в 23:08

Можно также использовать pydoc modules, который можно отфильтровать с помощью grep, чтобы найти конкретный модуль. Вывод отображается в градиентном формате. Единственным недостатком этого подхода является то, что он также будет включать файлы python в текущем рабочем каталоге. Тем не менее, я использую его сам большую часть времени, и это один из высоко цитируемых подходов к этому связанному вопросу: https://stackoverflow.com/q/739993/3701431

1
ответ дан 23 July 2018 в 23:08
  • 1
    Как и в вашем ответе, существует математический модуль, и для numby traceback не появился и для echo $? output was 0, означает ли это, что numpy также присутствует в моей системе? – TechJhola 22 February 2015 в 07:34
  • 2
    да, он есть в вашей системе. – souravc 22 February 2015 в 07:35
  • 3
    Если у вас нет модуля numpy, как вы его импортируете? Когда мы делаем кодирование, мы вызываем оператор import из numpy import *, будет ли он устанавливать модуль? Если нет, как мы будем устанавливать новый модуль? – TechJhola 22 February 2015 в 07:39
  • 4
    Будет вопрос о том, как установить модуль. Нужны разные пакеты для разных модулей. Например, чтобы установить vpython, вам необходимо установить его как sudo apt-get install python-visual libgtkglextmm-x11-1.2-dev – souravc 22 February 2015 в 07:48
  • 5
    не используйте sudo pip; он может сломать системный питон. Используйте apt-get для установки пакетов для системного python. Вы можете использовать опцию pip --user или virtualenv для установки пакетов Python для себя. – jfs 23 February 2015 в 11:03

Другим способом является модуль pkgutil. Работает как с Python 2 & amp; 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Вам нужно заменить module на имя вашего модуля, например:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)' 1
14
ответ дан 23 July 2018 в 23:08
  • 1
    Я видел, как ты расстегнул некоторыми моими изменениями; print() также будет работать в Python 2; она рассматривается как группа-с-скобки синтаксис, и не имеют никаких побочных эффектов. Только тогда, когда вы хотите добавить несколько элементов (как в print('a', 'b'), то это будет рассматриваться как tuple, в которой тебе нужно клавиши [F4], Но это не применимо в этом случае, вы можете просто написать вперед-совместимый код, добавив скобки (я проверял мои изменения в Python 2 и 3). – Martin Tournoij 23 February 2015 в 05:24
  • 2
    @Carpetsmoker: Спасибо за указание. Я откатываюсь от старой версии. – cuonglm 23 February 2015 в 05:28
  • 3
    Это отличный ответ. Я добавил производный ответ, который возвращает код выхода / статуса (для управления потоком сценариев оболочки) и принимает имя модуля в качестве аргумента командной строки. [D0] askubuntu.com/a/891384/146273 – Bruno Bronosky 14 December 2017 в 22:09

Чтобы получить другой ответ, для завершения:

Вы можете (ab) использовать параметр -m. Из man-страницы Python:

-m module-name Searches sys.path for the named module and runs the correspond‐ ing .py file as a script.

Что даст нам:

$ python2 -m numpy /sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed $ python2 -m math /sbin/python2: No code object available for math

Но для несуществующих модулей это даст нам:

$ python2 -m doesnt_exist /sbin/python2: No module named doesnt_exist

Мы могли бы использовать grep для этого:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Nope $ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Yup

Это немного хак-иш, а не то, для чего предназначался -m; но это метод, который требует наименьшего набора текста, если вы хотите быстрый тест: -)

6
ответ дан 23 July 2018 в 23:08
  • 1
    grep -q делает перенаправление ненулевым. – muru 23 February 2015 в 05:13
  • 2
    @muru Yikes! На протяжении многих лет я набрал много бесполезных перенаправлений на /dev/null: - / – Martin Tournoij 23 February 2015 в 05:25

Я написал пример в Python:

import pip import sys from bigml.api import BigML if not 'bigml' in sys.modules.keys(): pip.main(['install', 'bigml'])
2
ответ дан 23 July 2018 в 23:08

Я знаю, что OP первоначально запрашивал решение после запуска Python, но за пределами python я использую pip. На ubuntu: sudo apt-get install python-pip, если он еще не установлен.

Затем, чтобы узнать, какие модули сторонних модулей доступны, просто запустите:

pip freeze

Или даже

pip list

И оба будут показывать вам все установленные модули и их версии.

Если модуль, который вы ищете, не установлен, большую часть времени вы можете легко установить его с помощью pip:

pip install <module-name>

Если вы не знаете, существует ли модуль или его имя PyPI, используйте pip search:

pip search <keyword>
8
ответ дан 23 July 2018 в 23:08
  • 1
    Кроме того, pip show <module-name> покажет, установлен ли пакет, например. [F2]. – KutalmisB 4 July 2018 в 21:20

Если мы не хотим импортировать нежелательный модуль (что произойдет в инструкции try), мы можем использовать sys.modules для тестирования модулей, которые были установлены и были импортированы ранее.

В проблеме оболочки python:

>>> import sys

Затем проверьте наличие установленных модулей:

>>> 'numpy' in sys.modules True >>> 'scipy' in sys.modules False

Обратите внимание, что только те модули, которые были импортированы, перед тем, как дать True на этом test, все остальные модули (даже если они установлены) приводят к False.

. Другая альтернатива try оператора import в консоли python вызывает встроенную функцию help(). Это не даст документации для не установленных модулей, например

>>> help('scipy') no Python documentation found for 'scipy'

Вывод очень длинных справочных документов установленных модулей может быть прерван Q.

Теперь, чтобы установить отсутствующие модулей рекомендуется использовать и (а не путь Python), потому что нам нужен root-доступ, а также для предотвращения испорчения нашей сильно зависимой от Python системы. Для рассматриваемого модуля это будет, например, be:

sudo apt-get install python-scipy ## for Python2 sudo apt-get install python3-scipy ## for Python3

После установки мы можем добавить их в словарь sys.modules, импортировав их один раз.

17
ответ дан 23 July 2018 в 23:08
  • 1
    Я думаю, что это самый пифонический ответ .... – Grijesh Chauhan 22 February 2015 в 20:48
  • 2
    Первая часть этого неверна: sys.modules содержит только модули, у которых уже был импортирован , поэтому он не является надежным способом проверить, установлен ли модуль. Самым надежным тестом является использование try/except и ловушка ImportError, как уже говорили некоторые другие. – ekhumoro 22 February 2015 в 23:16
  • 3
    @ekhumoro - спасибо, я буду редактировать мой ответ, чтобы сделать это более ясным. – Takkat 23 February 2015 в 00:05
  • 4
    Это все еще кажется недостаточно ясным. Учитывая, что вопрос заключается в том, чтобы выяснить, установлен ли модуль (не импортирован ), sys.modules совершенно не имеет значения, и я думаю, что любое упоминание об этом вводит в заблуждение. Но, возможно, это только я. – David Z 23 February 2015 в 11:32
  • 5
    sys.modules здесь никакой помощи. – cat 7 July 2016 в 02:35

Другие вопросы по тегам:

Похожие вопросы: