Найти все пакеты, установленные с помощью easy_install / pip?

Вот один, который я сделал. Он занимает текущее время в GMT и время после последней перезагрузки, чтобы экстраполировать дату, когда устройство было в последний раз перезапущено. Затем он отслеживает эту дату в памяти с помощью NSUserDefaults. Наслаждайтесь!

Примечание. Поскольку вы хотите проверить это с момента запуска приложения в последний раз, вам нужно убедиться, что вы вызываете метод в любое время, когда приложение запущено. Самый простой способ - вызвать метод ниже в +(void)initialize {, а затем, когда вам нужно его вручную проверить

#define nowInSeconds CFAbsoluteTimeGetCurrent()//since Jan 1 2001 00:00:00 GMT
#define secondsSinceDeviceRestart ((int)round([[NSProcessInfo processInfo] systemUptime]))
#define storage [NSUserDefaults standardUserDefaults]
#define DISTANCE(__valueOne, __valueTwo) ((((__valueOne)-(__valueTwo))>=0)?((__valueOne)-(__valueTwo)):((__valueTwo)-(__valueOne)))

+(BOOL)didDeviceReset {
    static BOOL didDeviceReset;
    static dispatch_once_t onceToken;
    int currentRestartDate = nowInSeconds-secondsSinceDeviceRestart;
    int previousRestartDate = (int)[((NSNumber *)[storage objectForKey:@"previousRestartDate"]) integerValue];
    int dateVarianceThreshold = 10;
    dispatch_once(&onceToken, ^{
        if (!previousRestartDate || DISTANCE(currentRestartDate, previousRestartDate) > dateVarianceThreshold) {
            didDeviceReset = YES;
        } else {
            didDeviceReset = NO;
        }
    });
    [storage setObject:@(currentRestartDate) forKey:@"previousRestartDate"];
    [storage synchronize];
    return didDeviceReset;
}
372
задан suci 14 April 2015 в 03:01
поделиться

12 ответов

pip freeze выведет список установленных пакетов и их версий. Он также позволяет записывать эти пакеты в файл, который впоследствии можно будет использовать для настройки новой среды.

https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze

360
ответ дан TheodorosPloumis 14 April 2015 в 03:01
поделиться

Как отметил @almenon, это больше не работает, и это не поддерживаемый способ получения информации о пакете в вашем коде. Следующее вызывает исключение:

import pip
installed_packages = dict([(package.project_name, package.version) 
                           for package in pip.get_installed_distributions()])

Для этого вы можете импортировать pkg_resources. Вот пример:

import pkg_resources
installed_packages = dict([(package.project_name, package.version)
                           for package in pkg_resources.working_set])

Я на v3.6.5

1
ответ дан mscheker 14 April 2015 в 03:01
поделиться

Для тех, у кого не установлен pip, я нашел этот быстрый скрипт на github (работает с Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
1
ответ дан Ed K 14 April 2015 в 03:01
поделиться

pip freeze перечисляет все установленные пакеты, даже если это не pip / easy_install. На CentOs / Redhat обнаружен пакет, установленный через rpm.

1
ответ дан user3013438 14 April 2015 в 03:01
поделиться

Получите все имена файлов / папок в site-packages/dist-packages/, если они существуют) и используйте ваш менеджер пакетов, чтобы удалить те, которые были установлены через пакет.

1
ответ дан Ignacio Vazquez-Abrams 14 April 2015 в 03:01
поделиться

Вот одна строка для fedora или других дистрибутивов rpm (на основе подсказок @barraponto):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Добавьте это к предыдущей команде, чтобы получить более чистый вывод:

 | sed -r 's:.*/(\w+)/__.*:\1:'
2
ответ дан eddygeek 14 April 2015 в 03:01
поделиться

pip.get_installed_distributions() выдаст список установленных пакетов

import pip
from os.path import join

for package in pip.get_installed_distributions():
    print(package.location) # you can exclude packages that's in /usr/XXX
    print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
.
5
ответ дан yegle 14 April 2015 в 03:01
поделиться

Ниже немного медленно, но он дает хорошо отформатированный список пакетов, о которых знает pip. То есть, не все из них были установлены «по» pip, но все они должны быть в состоянии обновляться с помощью pip.

$ pip search . | egrep -B1 'INSTALLED|LATEST'

Причина, по которой он медленный, заключается в том, что он перечисляет содержимое всего Pypi репо. Я подал заявку , предлагая pip list обеспечить аналогичную функциональность, но более эффективно.

Пример вывода: (ограничен поиск подмножеством вместо «.» Для всех.)

$ pip search selenium | egrep -B1 'INSTALLED|LATEST'

selenium                  - Python bindings for Selenium
  INSTALLED: 2.24.0
  LATEST:    2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
  INSTALLED: 1.0.1 (latest)
$
6
ответ дан MarkHu 14 April 2015 в 03:01
поделиться

Начните с:

$ pip list

Для просмотра списка всех пакетов. После того, как вы нашли нужный пакет, используйте:

$ pip show <package-name>

Это покажет вам подробную информацию об этом пакете, включая его папку. Вы можете пропустить первую часть, если вы уже знаете имя пакета

Нажмите здесь для получения дополнительной информации о пип-шоу и здесь для получения дополнительной информации о списке пипсов.

Пример:

$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    
16
ответ дан ng10 14 April 2015 в 03:01
поделиться

Если Debian ведет себя как последние версии Ubuntu относительно цели по умолчанию pip install, это очень просто: он устанавливается на /usr/local/lib/ вместо /usr/lib (apt цель по умолчанию). Проверьте https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Я пользователь ArchLinux и, поэкспериментировав с pip, я столкнулся с этой же проблемой. Вот как я решил это в Arch.

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'

Ключ здесь - /usr/lib/python2.7/site-packages, то есть каталог, в который устанавливается pip, YMMV. pacman -Qo Как Arch pac kage man ager проверяет право собственности на файл. No package является частью возврата, который он дает, когда ни один пакет не владеет файлом: error: No package owns $FILENAME. Хитрый обходной путь: я спрашиваю о __init__.py, потому что pacman -Qo немного невежественен, когда дело доходит до каталогов: (

Чтобы сделать это для других дистрибутивов, вы должны выяснить, где pip ] устанавливает вещи (просто sudo pip install что-то), как запросить право собственности на файл (метод Debian / Ubuntu - dpkg -S) и что возвращает «ни один пакет не владеет этим путем» (Debian / Ubuntu - no path found matching pattern). Пользователи Debian / Ubuntu, будьте осторожны: dpkg -S не удастся, если вы дадите ему символическую ссылку. Сначала разрешите ее, используя realpath. Например:

find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'

Пользователи Fedora могут попробовать (спасибо @eddygeek ):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
23
ответ дан Capi Etheriel 14 April 2015 в 03:01
поделиться

Если кому-то интересно, вы можете использовать команду «pip show».

pip show [options] <package>

Это перечислит каталог установки данного пакета.

132
ответ дан Daniel Sikes 14 April 2015 в 03:01
поделиться

Начиная с версии 1.3 pip, теперь вы можете использовать pip list

. У него есть несколько полезных опций, включая возможность показывать устаревшие пакеты. Вот документация: https://pip.pypa.io/en/latest/reference/pip_list/

241
ответ дан Glen Selle 14 April 2015 в 03:01
поделиться
Другие вопросы по тегам:

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