Como encontro o executável do Python que meu servidor está usando?

1

Sou novo no Linux.

Estou gerenciando um servidor (Linux - Apache - mod_wsgi - Django), onde existem várias instalações do Python. O site está funcionando atualmente, mas quero descobrir qual executável do Python é usado para executá-lo. Eu sei que não é o padrão.

Além disso, como o mod_wsgi sabe qual instalação do Python usar? O script .wsgi não possui uma linha shebang.

    
por Ram Rachum 31.01.2010 / 17:01

5 respostas

5

O #! linha não é usada e normalmente não seria colocada em um arquivo de script WSGI como usado por mod_wsgi.

Para determinar qual versão / instalação do Python é usada, existem duas partes.

O primeiro como apontado por outra pessoa é descobrir a que biblioteca do Python mod_wsgi.so está vinculada. Na maioria dos sistemas UNIX, isso é feito usando o comando 'ldd'.

ldd mod_wsgi.so

Execute isto no mod_wsgi.so real instalado no diretório de módulos do Apache que está sendo usado. Isso lhe dirá com certeza qual versão do mod_wsgi foi compilada.

Se você não encontrar uma referência a um arquivo libpythonX.Y.so, o seu mod_wsgi.so foi vinculado estaticamente à biblioteca Python. Embora isso funcione, desde que o mod_python também não seja carregado no mesmo Apache, é uma péssima idéia confiar nele como o uso de vinculação estática dos resultados da biblioteca Python ao inchaço desnecessário de seus processos do Apache devido à realocação de código em tempo de execução. ser feito ao carregar o mod_wsgi.so com a biblioteca Python vinculada estaticamente.

Note que o valor de 'sys.executable' quando executado sob o mod_wsgi não tem significado e não pode ser usado como um meio de determinar qual versão do Python foi usada. Isso ocorre porque a linha de comando Python não é usada. Em vez disso, o executável que está sendo executado é, na verdade, o Apache e o sys.executable provavelmente refletirá isso. É somente depois que o Apache é executado e o mod_wsgi.so carregado que o Python é inicializado usando APIs do Python incorporadas. Da mesma forma, executar 'qual python' não ajudará a determinar exatamente qual instalação do Python está sendo usada.

A segunda parte é descobrir qual instalação do Python foi realmente usada em tempo de execução. Para fazer isso, você deve usar um programa world hello WSGI e modificá-lo para despejar o valor de 'sys.prefix'. Isso informa o diretório raiz sob o qual a instalação do Python está localizada. Com base em qual versão da biblioteca compartilhada do Python foi usada, você saberá qual diretório 'lib / pythonX.Y' real sob esse diretório raiz está sendo usado. A versão é importante, pois pode haver várias versões instaladas nesse diretório raiz.

Note que o que você obtém para 'sys.prefix' pode realmente ser diferente do diretório raiz, como você pensou que pode ser baseado na dependência de libpythonX.Y.so do arquivo mod_wsgi.so. Isto é devido à maneira como o Python, quando inicializado, tenta encontrar seu diretório 'lib'.

Por exemplo, se você tivesse o Python 2.6 instalado em '/ usr / local' e outro instalado em '/ usr', mas você compilasse o mod_wsgi contra o '/ usr / local', você ainda pode achar que 'sys .prefix 'resolvido para' / usr '. Isso ocorre porque, por padrão, em sistemas incorporados, o Python examina o valor da variável de ambiente 'PATH' para obter um caminho de pesquisa para localizar um executável 'python' como base para calcular o diretório raiz, mesmo que o executável 'python' não tenha sido usado. comece o processo.

Sob o Apache, porque geralmente é iniciado como 'root', ele não teria necessariamente '/ usr / local / bin' em seu 'PATH' e, portanto, provavelmente encontraria '/ usr / bin / python' use '/ usr' para 'sys.prefix'.

Neste último tipo de cenário, onde se encontra um diretório raiz diferente do que você deseja usar, é possível usar a diretiva WSGIPythonHome na configuração do Apache para substituir o que 'sys.prefix' é calculado automaticamente.

Note que você NÃO PODE usar o WSGIPythonHome para se referir a uma versão diferente do Python, ele deve se referir a um diretório raiz contendo uma instalação do Python da mesma versão principal / secundária. Se você precisar usar uma versão diferente do Python, deverá recompilar e reinstalar o mod_wsgi para que ele seja compilado na versão diferente. A versão / instalação real do Python a ser usada durante a compilação pode ser especificada usando a opção '--with-python' para o script de configuração mod_wsgi quando estiver sendo construído.

Existem outras maneiras de usar a diretiva WSGIPythonHome para substituir a instalação do Python, mas recomenda-se que você fique com o WSGIPythonHome.

    
por 31.01.2010 / 22:59
2

mod_wsgi está vinculado a uma versão específica do 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

como alternativa, você pode fazer

www:~# ldd /usr/lib/apache2/modules/mod_wsgi.so
    ...
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7de0000)
    ...
    
por 31.01.2010 / 17:33
2
$ 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
    
por 31.01.2010 / 20:14
0

qual python

Isso deve mostrar o python que está sendo escolhido pelo shell.

Você desejará executar isso como o usuário do apache para ter seu conjunto $ PATH, em vez de seus usuários.

    
por 31.01.2010 / 17:24
0

Você pode acessar sys.executable de dentro do código Python para saber qual binário do interpretador é usado. Codifique uma página WSGI para fazer isso.

    
por 31.01.2010 / 18:21