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