Назад | Перейти на главную страницу

Как мне найти исполняемый файл Python, который использует мой сервер?

Я новичок в Linux.

Я управляю сервером (Linux - Apache - mod_wsgi - Django), на котором установлено несколько версий Python. Сайт в настоящее время работает, но я хочу узнать, какой исполняемый файл Python используется для его запуска. Я знаю, что это не по умолчанию.

Кроме того, как mod_wsgi узнает, какую установку Python использовать? В .wsgi в скрипте нет строки shebang.

#! строка не используется и обычно не помещается в файл сценария WSGI, используемый mod_wsgi.

Чтобы определить, какая версия / установка Python используется, есть две части.

Первый, как указал кто-то другой, - это выяснить, с какой библиотекой Python mod_wsgi.so связана. В большинстве систем UNIX это делается с помощью команды ldd.

ldd mod_wsgi.so

Запустите это на фактическом модуле mod_wsgi.so, установленном в каталог модулей Apache, который используется. Это точно скажет вам, какая версия mod_wsgi была скомпилирована.

Если вы не видите ссылку на файл libpythonX.Y.so, значит, ваш mod_wsgi.so был статически связан с библиотекой Python. Хотя это будет работать, пока mod_python не загружен в тот же Apache, полагаться на него - очень плохая идея, поскольку использование статической компоновки библиотеки Python приводит к ненужному раздуванию ваших процессов Apache из-за перемещения кода времени выполнения, который должен выполняется при загрузке mod_wsgi.so со статически связанной библиотекой Python.

Обратите внимание, что значение sys.executable при запуске под mod_wsgi не имеет значения и не может использоваться как средство определения того, какая версия Python использовалась. Это потому, что командная строка Python не используется. Вместо этого исполняемый файл, который запускается, на самом деле является Apache, и sys.executable, скорее всего, будет отражать это. И только после того, как Apache запущен и загружен mod_wsgi.so, Python инициализируется с использованием встроенных API Python. Точно так же запуск «which python» не поможет определить, какая именно установка Python используется.

Во второй части выясняется, какая установка Python фактически использовалась во время выполнения. Для этого вы должны использовать программу WSGI hello world и изменить ее, чтобы выгрузить значение sys.prefix. Это сообщает вам корневой каталог, в котором находится установка Python. В зависимости от того, какая версия общей библиотеки Python использовалась, вы узнаете, какой именно каталог lib / pythonX.Y в этом корневом каталоге используется. Версия важна, поскольку в этом корневом каталоге может быть установлено несколько версий.

Обратите внимание, что то, что вы получаете для sys.prefix, на самом деле может отличаться от корневого каталога, поскольку вы думали, что он может быть основан на зависимости libpythonX.Y.so от файла mod_wsgi.so. Это связано с тем, что Python при инициализации пытается найти свой каталог lib.

Например, если у вас был Python 2.6, установленный в каталоге / usr / local, а другой - в каталоге / usr, но вы скомпилировали mod_wsgi в соответствии с ним в каталоге / usr / local, вы все равно можете найти этот «sys.prefix» разрешено в '/ usr'. Это связано с тем, что по умолчанию во встроенных системах Python просматривает значение переменной среды PATH, чтобы получить путь поиска для поиска исполняемого файла python в качестве базовой точки для вычисления корневого каталога, даже если этот исполняемый файл python не использовался для начать процесс.

В Apache, поскольку он обычно запускается как 'root', он не обязательно будет иметь '/ usr / local / bin' в вашем 'PATH' и, скорее всего, вместо этого найдет '/ usr / bin / python' и, таким образом, будет использовать '/ usr вместо sys.prefix.

В этом более позднем сценарии, когда он находит корневой каталог, отличный от того, который вы хотите использовать, можно использовать директиву WSGIPythonHome в конфигурации Apache, чтобы переопределить то, что 'sys.prefix' вычисляется автоматически.

Обратите внимание, что вы НЕ МОЖЕТЕ использовать WSGIPythonHome для ссылки на другую версию Python, он должен ссылаться на корневой каталог, содержащий установку Python той же основной / дополнительной версии. Если вам нужно использовать другую версию Python, вы должны перекомпилировать и переустановить mod_wsgi, чтобы он был скомпилирован с другой версией. Фактическая версия / установка Python, которая будет использоваться при компиляции, может быть указана с помощью параметра '--with-python' в скрипте конфигурации mod_wsgi во время его сборки.

Помимо использования директивы WSGIPythonHome есть и другие способы переопределить, какая установка Python используется, но рекомендуется придерживаться WSGIPythonHome.

$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import sys
>>> 
>>> print sys.executable
/usr/bin/python

mod_wsgi связан с конкретной версией Python.

www:~# ls -l /usr/lib/apache2/modules/mod_wsgi*
lrwxrwxrwx 1 root root     15 2009-07-27 12:35 /usr/lib/apache2/modules/mod_wsgi.so -> mod_wsgi.so-2.5
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.4
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.5

в качестве альтернативы вы можете сделать

www:~# ldd /usr/lib/apache2/modules/mod_wsgi.so
    ...
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7de0000)
    ...

Вы можете получить доступ sys.executable из кода Python, чтобы узнать, какой двоичный интерпретатор используется. Для этого закодируйте страницу WSGI.

какой питон

Это должно показать питон, который подхватывается оболочкой.

Вы захотите запустить это как пользователь apache, чтобы установить их $ PATH, а не ваши пользователи.