Поскольку вы можете попасть на консоль, возможно, проще всего попробовать сначала войти и запустить:
sudo apt-get install --fix-broken
Если проблема заключается лишь в том, что некоторые пакеты не закончили настройку, она должна иметь возможность завершить это, сеть или нет.
Вы можете поместить код внутри блока 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
Я обнаружил, что для обеспечения инициализации моей инфраструктуры ** 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, но вы можете найти себя в такой ситуации, как я, где вы используете устаревшую версию и не хотите использовать устаревшие плагины.
Можно также использовать pydoc modules, который можно отфильтровать с помощью grep, чтобы найти конкретный модуль. Вывод отображается в градиентном формате. Единственным недостатком этого подхода является то, что он также будет включать файлы python в текущем рабочем каталоге. Тем не менее, я использую его сам большую часть времени, и это один из высоко цитируемых подходов к этому связанному вопросу: https://stackoverflow.com/q/739993/3701431
Другим способом является модуль 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
в качестве другого ответа, ради завершения по:
Вы можете (АБ)использовать параметр -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 был предназначен для, но это метод, который требует меньше ввода, если вы хотите быстрый тест :-)
Я написал пример в Python:
import pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
я знаю, что ОП изначально просил решение после запуска питона, но питон я использую pip. На Ubuntu: sudo apt-get install python-pip, если он еще не установлен.
затем, чтобы увидеть, какие модули сторонних разработчиков доступны, просто запустите:
pip freeze
или даже
pip list
и оба покажут Вам всех установленных модулей и их версий.
, если модуль, который вы ищете не установлен, большую часть времени вы можете легко установить его с PIP:
pip install <module-name>
если Вы не уверены, является ли модуль существует или что его PyPI имя, использовать pip search:
pip search <keyword>
Если мы не хотим импортировать нежелательный модуль (что произойдет в инструкции 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, импортировав их один раз.
Вы можете поместить код внутри блока 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
я нашел, что для того, чтобы сделать мою подготовку инфраструктуры** идемпотентом, я должен быть в состоянии проверить для пакета из раковины в проявляющаяся. Я построил на ответ @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, но вы можете найти себя в ситуации, как мне, где вы используете устаревшую версию и не хотите использовать устаревшие плагины.
Можно также использовать pydoc modules, который можно отфильтровать с помощью grep, чтобы найти конкретный модуль. Вывод отображается в градиентном формате. Единственным недостатком этого подхода является то, что он также будет включать файлы python в текущем рабочем каталоге. Тем не менее, я использую его сам большую часть времени, и это один из высоко цитируемых подходов к этому связанному вопросу: https://stackoverflow.com/q/739993/3701431
Другим способом является модуль 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
Чтобы получить другой ответ, для завершения:
Вы можете (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; но это метод, который требует наименьшего набора текста, если вы хотите быстрый тест: -)
Я написал пример в Python:
import pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
Я знаю, что 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>
Если мы не хотим импортировать нежелательный модуль (что произойдет в инструкции 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, импортировав их один раз.