Вот один, который я сделал. Он занимает текущее время в 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;
}
pip freeze
выведет список установленных пакетов и их версий. Он также позволяет записывать эти пакеты в файл, который впоследствии можно будет использовать для настройки новой среды.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
Как отметил @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
Для тех, у кого не установлен pip, я нашел этот быстрый скрипт на github (работает с Python 2.7.13):
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
pip freeze перечисляет все установленные пакеты, даже если это не pip / easy_install. На CentOs / Redhat обнаружен пакет, установленный через rpm.
Получите все имена файлов / папок в site-packages/
(и dist-packages/
, если они существуют) и используйте ваш менеджер пакетов, чтобы удалить те, которые были установлены через пакет.
Вот одна строка для 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:'
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
. Ниже немного медленно, но он дает хорошо отформатированный список пакетов, о которых знает 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)
$
Начните с:
$ 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
Если 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'
Если кому-то интересно, вы можете использовать команду «pip show».
pip show [options] <package>
Это перечислит каталог установки данного пакета.
Начиная с версии 1.3 pip, теперь вы можете использовать pip list
. У него есть несколько полезных опций, включая возможность показывать устаревшие пакеты. Вот документация: https://pip.pypa.io/en/latest/reference/pip_list/