Должны ли мы позволить Python pip перезаписывать модули, которые были установлены RPM?

rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *

rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *

Нам нужно понять, что под капотом rename — это всего лишь код Perl.Думайте об этом так: подстановочный знак * передает имена этому коду в цикле, и над каждым из этих имен мы выполняем следующие действия:

  • Проверяем, является ли текущее имя ( хранится в контейнере цикла $_) — это обычный файл (оператор проверки файла -f имя файла, если имя файла опущено, по умолчанию используется значение $_ ) : Чтобы переименовать не подумал, что -f, который мы хотим для нашего файла-теста, является опцией, мы используем пробел перед -f, чтобы предотвратить такая возможность!!!
  • Было бы бессмысленно выполнять переименование, если имя файла не содержало ни одного символа (символов) верхнего регистра. Таким образом, мы проверяем этот факт в расширении имени файла с помощью этого регулярного выражения: /[AZ][^.]*$/ Это смотрит на непрерывный ряд неточечных символов, видимых с конца имени файла. чтобы утверждать, что в расширенной части имени файла присутствует хотя бы одна прописная буква. Может случиться так, что о расширении не может быть и речи. Об этом факте позаботятся на следующем шаге, где мы ищем литерал . в имени файла.
  • Теперь мы знаем, что текущее имя файла является обычным файлом И является кандидатом на переименование из-за наличия хотя бы одной буквы в верхнем регистре. Регулярное выражение s/\.[^.]+$/\L$&/ изолирует полную часть расширения в текущем имени файла, глядя с конца имени файла и глядя влево и захватывая все не-точки [^.]+ символов до литерала \. .\L$& превратит все прописные буквы в нижний регистр в соответствующем тексте.
  • Я добавил вторую версию, в которой мы выполняем всю работу в одной команде s/// по проверке верхнего регистра в расширении.
  • Специальное примечание: m// и s/// обычно запускаются для прикрепленной строки с помощью оператора =~, например, $var =~ m/[AZ]+/ $filenm =~ s/ABC/DEF/. Но в случае, если рассматриваемая переменная оказывается $_, тогда мы можем обойтись без =~ и написать просто m/[AZ]+/ s/ABC/DEF/ будет означать, что переменная, с которой работают эти регулярные выражения, — это $_. Кроме того, мы можем обойтись без m в случае m//, когда разделителями являются косые черты. Однако нам это нужно в случае, скажем, m{} m|| и т. д. Это очень распространенная идиома в стиле Perl.
0
23.04.2016, 02:45
5 ответов

Если вы хотите иметь возможность использовать python только для себя, не портя системный питон, обратите внимание на продукт под названием Anaconda от Continuum. http://Continuum.io/downloads эта установка python и т.д. будет установлена ​​в ваш домашний каталог и изменит пути, поэтому вы не устанавливаете python в свои системы и, возможно, испортите вашу систему. Вы также можете создавать виртуальные среды, и среды Conda из этих опций позволяют вам попробовать что-то, а если вам это не нравится, просто сдуйте среду.

2
28.01.2020, 02:14

CentOS 7.x является производным от Red Hat Enterprise 7.x, который предназначен для стабильный . Это неизбежно означает, что программы, доступные в репозиториях, какое-то время были протестированы. Вы можете увидеть это из описания на их веб-сайте:

CentOS Project - это проект бесплатного программного обеспечения, управляемый сообществом, направленный на создание надежной экосистемы с открытым исходным кодом. Для пользователей мы предлагаем согласованную управляемую платформу , которая подходит для широкого спектра развертываний. Для сообществ с открытым исходным кодом мы предлагаем прочную, предсказуемую основу , на которой можно опираться, а также обширные ресурсы для создания, тестирования, выпуска и поддержки их кода.

Если вам нужен «передовой» код, вы можете использовать Fedora . Fedora преследует разные цели:

Проект Fedora - это глобальное партнерство членов сообщества свободного программного обеспечения. Проект Fedora спонсируется Red Hat, которая инвестирует в нашу инфраструктуру и ресурсы, чтобы поощрять сотрудничество и инкубировать новые инновационные технологии . Некоторые из этих технологий могут быть позже интегрированы в продукты Red Hat. Они разрабатываются в Fedora и с самого начала производятся под свободной лицензией с открытым исходным кодом, поэтому другие сообщества и проекты свободного программного обеспечения могут свободно изучать, принимать и изменять их.

Конечно, есть компромиссы, но нельзя иметь одновременно «стабильную» и «новую».

1
28.01.2020, 02:14

Есть ли единое мнение о том, что здесь следует делать?

Да, не изменяйте управляемую системой установку Python вручную (запуская pip) - смотрите Каковы риски запуска 'sudo pip'? Для более глубокого обсуждения этого вопроса, пожалуйста, прочитайте выпуск 1668 Default to --user pip и другие связанные с ним выпуски.

Наиболее распространенные решения:

  • Установка пакетов Python в домашний каталог пользователя (схема пользователя)
  • Компиляция Python из исходников и использование этого экземпляра вместо системного

Теоретически другим возможным решением было бы использование опции --target в pip и установка PYTHONPATH переменной окружения. Однако опция --target имеет множество (на данный момент 12) проблем.

0
28.01.2020, 02:14

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

https://stackoverflow.com/questions/2915471/install-a-python-package-into-a-different-directory-using-pip

2
28.01.2020, 02:14

Не лучше ли устанавливать pip и модули из RPM? Может быть, просто установить Python из RPM, а затем установить все модули из pip (чтобы ни один из модулей Python не был из RPM и полностью управлялся pip)?

Можно установить pip и другие модули Python из диспетчера пакетов вашей ОС. Возможно, у вас больше не будет выбора, поскольку многие системные компоненты зависят от Python, и даже в минимально установленной версии ОС вы обнаружите, что модули Python + Python установлены по умолчанию.

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

Следующие инструкции относятся к производной от RHEL ОС, а версия Python, доступная в то время, была 2.7.x. Вам нужно будет настроить PYTHONPATH в соответствии с установленной версией Python.

  • Убедитесь, что установлена ​​версия диспетчера пакетов python-pip. например yum -y установить python-pip .

  • Создайте сценарий profile.d для настройки переменной среды PYTHONPATH:

     # Убедитесь, что PYTHONPATH настроен на использование /usr/local/lib*/python2.7/site-packages
    read -r -d '' pythonpath_profile_script << 'EOF' 
    pythonpathmunge () {
    case ": $ {PYTHONPATH}:" in 
     *: "$ 1": *) {{1 }} ;; 
     *) 
    если ["$ 2" = "после"]; тогда 
    PYTHONPATH = $ PYTHONPATH: $ 1 
    else 
    PYTHONPATH = $ 1: $ PYTHONPATH 
    fi 
    esac 
    } {{1 }} 
    pythonpathmunge /usr/local/lib/python2.7/site-packages
    pythonpathmunge /usr/local/lib64/python2.7/site-packages
    export PYTHONPATH { {1}} EOF 
     
    echo "Создание скрипта профиля /etc/profile.d/pythonpath.sh:" 
    echo "$ {pythonpath_profile_script}"> / etc / profile .d / pythonpath.sh 
    chown root.root /etc/profile.d/pythonpath.sh
    chmod -v 0644 /etc/profile.d/pythonpath.sh
    source /etc/profile.d/pythonpath.sh
    hash -r 
     
  • Затем вы можете выбрать установку последней версии pip или любого другого модуля python с помощью:

     pip install --upgrade << НАЗВАНИЕ МОДУЛЯ PYTHON >> --ignore-installed --install-option = "- prefix = / usr / local" --log / var / log / << НАЗВАНИЕ МОДУЛЯ PYTHON >> - install- $ (дата "+% Y% m% d% H% M% S"). log 
     

    например

     pip install --upgrade pip --ignore-installed --install-option = "- prefix = / usr / local" --log / var / log / pip-install - $ (date "+% Y% m% d% H% M% S "). log 
    hash -r 
     # Обратите внимание на использование` hash -r` для обновления хеш-таблицы bash недавно 
     # исполняемого файла программы. Без этого вы можете обнаружить, что используемая команда 'pip' 
     # не является той версией, которую вы только что установили. 
     

Это установит запрошенный модуль Python в / usr / local , где он не будет мешать файлам, управляемым системным диспетчером пакетов. Параметр - ignore-installed гарантирует, что pip не коснется существующей версии модуля. Кроме того, из-за использования переменной среды PYTHONPATH пути /usr/local/lib*/python2.7/site-packages будут использоваться до любых пакетов, установленных системой. т.е.

[root@localhost ~]# python
Python 2.7.5 (default, Sep 15 2016, 22:37:39)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print '\n'.join(sys.path)

/usr/local/lib64/python2.7/site-packages        <---
/usr/local/lib/python2.7/site-packages          <---
/root
/usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/usr/lib64/python2.7/site-packages
/usr/lib/python2.7/site-packages
>>>

Наконец, по крайней мере, в CentOS / RHEL, путь / usr / local / bin находится перед любыми другими системными двоичными путями в переменной среды PATH, и, следовательно, это также гарантирует, что любые новые двоичные файлы установленные в / usr / local / bin имеют приоритет над установленными в системе. то есть

[root@localhost ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2
28.01.2020, 02:14

Теги

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