В этой статье будет объяснена точная разница между /usr/bin/python и /usr/local/bin/python, пути к общей библиотеке, которые ищут эти два типа python, dist-packages и site-packages, методы указания путей к общей библиотеке. на системном уровне.

Разница между /usr/bin/python и /usr/local/bin/python

/usr/bin: содержит исполняемые программы, являющиеся частью операционной системы и устанавливаемые менеджером пакетов.

/usr/local/bin: расположение по умолчанию для исполняемых программ, не являющихся частью операционной системы и установленных там локальным администратором, обычно после их сборки из исходного кода с последовательностью configure;make;make install. Цель состоит не в том, чтобы сломать систему, перезаписав функциональную программу нефункциональной или программой с другим поведением.

Когда одна и та же программа существует в обоих каталогах, вы можете выбрать, какой из них будет вызываться по умолчанию, изменив порядок каталогов в вашем PATH.

Таким образом, /usr/bin/python обычно является системным python, управляемым системным менеджером пакетов, таким как apt, в то время как /usr/local/bin/python или какой-либо исполняемый файл, например /usr/local/bin/vtkpython , обычно вручную компилируется из исходного кода.

Разница между путями общей библиотеки, которую ищет разный питон

Пути общих библиотек Python указаны в sys.path.

sys.path содержит список строк, указывающих путь поиска модулей. Инициализируется из переменной окружения PYTHONPATH плюс значение по умолчанию, зависящее от установки.

Как инициализируется при запуске программы, первый элемент этого списка, path[0], представляет собой каталог, содержащий сценарий, который использовался для вызова интерпретатора Python. Если каталог сценария недоступен (например, если интерпретатор вызывается интерактивно или если сценарий читается из стандартного ввода), path[0] — это пустая строка, которая указывает Python сначала искать модули в текущем каталоге. Обратите внимание, что каталог сценария вставлен перед записями, вставленными в результате PYTHONPATH.

Одним словом, sys.path заполняется с использованием текущего рабочего каталога, за которым следуют каталоги, перечисленные в вашей переменной среды PYTHONPATH, за которыми следуют пути по умолчанию, зависящие от установки, которые контролируются модулем site.

Предполагая, что ваша переменная среды PYTHONPATH не установлена, sys.path будет состоять из текущего рабочего каталога плюс любые манипуляции, сделанные с ним модулем сайта, который автоматически импортируется при запуске Python.

Чтобы проверить это, просто запустите

import sys
print ('\n'.join(sys.path))

А вот результаты работы этого кода для разных версий Python в моей системе, просто для примера:

питон:

/home/lyl
/home/lyl/DoorGym/DoorGym-Unity/python_interface
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/home/lyl/.local/lib/python2.7/site-packages
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages

python3:

/home/lyl
/home/lyl/DoorGym/DoorGym-Unity/python_interface
/usr/lib/python36.zip
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/dist-packages
/usr/lib/python3/dist-packages

vtkpython:

/usr/local/lib/python3.6/site-packages
/home/lyl
/home/lyl/DoorGym/DoorGym-Unity/python_interface
/usr/lib/python36.zip
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/dist-packages
/usr/lib/python3/dist-packages

Мы видим, что системный python ищет свои общие библиотеки только в каталоге ~, некоторые из них указаны в каталоге PYTHONPATH, а некоторые в каталогах /usr/lib и /usr/local/lib (в основном /usr/lib), и вместо этого ищет только dist-packages. сайтов-пакетов.

Напротив, vtkpython в /usr/local/bin, на основе полного включения вышеуказанных путей, также покрывает больше контента, что в моем случае составляет /usr/local/lib/python3.6/site-packages.

Обратите внимание, что помимо dist-пакетов он содержит site-packages.

Таким образом, некоторые пакеты, которые вы установили локально, могут быть найдены только с помощью python в /usr/local/bin.

Но есть и несколько способов решить эту проблему

Например,

import sys
sys.path.append ('/usr/local/lib/python3.6/site-packages')

или просто отредактируйте ~/.bashrc и добавьте следующие строки:

export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.6/site-packages

Разница между dist-packages и site-packages

dist-packages — это специфичное для Debian соглашение, которое также присутствует в его производных, таких как Ubuntu. Модули устанавливаются в dist-packages, когда они поступают из диспетчера пакетов Debian в это место:

/usr/lib/python3.6/dist-packages

Так как easy_install и pip устанавливаются из менеджера пакетов, они тоже используют dist-пакеты, но пакеты ставят сюда:

/usr/local/lib/python3.6/dist-packages

Кроме того, стороннее программное обеспечение Python, установленное из пакетов Debian, входит в состав dist-packages, а не в site-packages. В то время как если вы вручную скомпилируете и установите интерпретатор Python из исходного кода, например vtkpython, он использует сайт-пакеты.

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

Например, если используемый вами pip соответствует системному python, то его собственные пакеты будут располагаться в /usr/lib/python3.6/dist-packages, а пакеты, которые вы установили, — в /usr/local/lib/python3.6/dist-packages.

Если используемый вами pip соответствует вашему питону, скомпилированному вручную из исходного кода, то его собственные пакеты и пакеты, установленные им, будут расположены в /usr/local/lib/python3.6/site-packages.

Различия между различными методами указания путей к общим библиотекам на системном уровне

Система может искать разделяемую библиотеку двумя способами, особенно в моем случае для кодов C++.

Первый — путем редактирования файлов в /etc/ld.so.conf.d.

Второй — с использованием переменной окружения LD_LIBRARY_PATH.

Под Linux поиск и загрузка разделяемых библиотек реализованы /lib/ld.so. ld.so ищет общие библиотеки, используемые приложением, по стандартному пути (/lib, /usr/lib).

Если общая библиотека, которую необходимо использовать, имеет нестандартный способ, общий метод Linux заключается в добавлении нестандартных путей к /etc/ld.so.cache. Когда ld.so загружает разделяемую библиотеку, он будет искать ее в ld.so.cache.

Для этого вы можете добавить эти каталоги в /etc/ld.so.conf, либо создать файл .conf в /etc/ld.so.conf.d и добавить в него эти каталоги. Например, создайте файл /etc/ld.so.conf.d/usr-local.conf, поместите в него /usr/local/lib и затем запустите sudo ldconfig. Чтобы проверить это, просто запустите

$ cat /etc/ld.so.conf.d/*.

ldconfig создает необходимые ссылки и кеширует самые последние общие библиотеки, найденные в каталогах, указанных в командной строке, в файле /etc/ld.so.conf и в доверенных каталогах, /lib и /usr/lib (на некоторых 64-разрядных архитектурах, таких как x86–64, /lib и /usr/lib являются доверенными каталогами для 32-битных библиотек, а /lib64 и /usr/lib64 используются для 64-битных библиотек).

Кэш используется компоновщиком времени выполнения, ld.so или ld-linux.so. ldconfig проверяет заголовок и имена файлов библиотек, с которыми сталкивается, при определении версий, ссылки на которые должны быть обновлены.

Использование переменной LD_LIBRARY_PATH — это еще один способ указать нестандартный путь. Когда ld.so загружает разделяемую библиотеку, он также ищет путь, заданный этой переменной. Однако многие выступают за то, чтобы избегать использования переменной LD_LIBRARY_PATH, особенно в качестве глобальной переменной.

Вот несколько замечаний:

  1. Добавляйте вещи в /lib и /usr/lib, /etc/ld.so.conf модифицировать не нужно, а ldconfig нужно настроить после окончания, иначе библиотека не будет найдена.
  2. Когда вы хотите добавить что-то в какое-то конкретное место, отличное от двух вышеуказанных каталогов, вы должны изменить /etc/ld.so.conf, а затем вызвать ldconfig, иначе вы этого не найдете. Например, если вы устанавливаете mysql в /usr/local/mysql, у MySQL есть много библиотек в /usr/local/mysql/lib. В это время вам нужно добавить строку /usr/local/mysql/lib под /etc/ld.so.conf. После сохранения ldconfig можно использовать для новой библиотеки. Обнаруживается во время работы программы.
  3. Все эти вещи, которые делает ldconfig, связаны с запуском программы, а вовсе не с ее компиляцией. При компиляции следует добавить -L.

Рекомендации