RESOLVED: python, PYTHONPATH, sys.path

Модератор: Модераторы разделов

Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

Помогите разобраться с путями в питоне.

На моей машине всё работает, а на хостинге не хочет, потому что у меня MySQLdb установлен прямо в /usr/lib/python..... а на хостинге нет... саппорт сказал что дескать установите себе локально, что я и проделал.

Но вот незадача, если я не посетаю PYTHONPATH в ту локальную папку куда я установил, гнусный питон ни за что этот модуль не видит как бы я не изворачивался. Как заставить его видеть модуль? может есть способ подсунуть модуль как-то прямо в папку со скриптами чтобы они были будто частью приложения? на PYTHONPATH я повлиять не могу. Скрипты выполняются как CGI.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение watashiwa_daredeska »

Добавляйте путь в sys.path прямо в самом начале скрипта, до import'ов.

cy6erGn0m писал(а):
12.03.2009 12:16
может есть способ подсунуть модуль как-то прямо в папку со скриптами чтобы они были будто частью приложения?
Это уже зависит от вашего хостера. А технически, можно, конечно.
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

watashiwa_daredeska писал(а):
12.03.2009 12:22
Добавляйте путь в sys.path прямо в самом начале скрипта, до import'ов.

cy6erGn0m писал(а):
12.03.2009 12:16
может есть способ подсунуть модуль как-то прямо в папку со скриптами чтобы они были будто частью приложения?
Это уже зависит от вашего хостера. А технически, можно, конечно.


Не работает sys.path.append.. всё перепробовал, не видит и всё тут, хоть тресни.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

ещё есть одна особенность: у меня на машине в папке site-packages есть папка MySQLdb а в ней скрипты, а target машине хостера установился egg файл, что-то вроде MySQL_python-1.2.2....egg
вероятно и не работает потому что он не может в рантайме подцепить этот egg-файл
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение watashiwa_daredeska »

cy6erGn0m писал(а):
12.03.2009 12:30
Не работает sys.path.append
Не то добавляете, не так добавляете и т.п. Как добавляете в sys.path (код)? Что есть по тому пути, который добавляете?

cy6erGn0m писал(а):
12.03.2009 12:40
а target машине хостера установился egg файл, что-то вроде MySQL_python-1.2.2....egg
egg-файл сам по себе не цепляется, насколько я помню. Цепляется pth-файл (у меня easy-install.pth, созданный автоматом при установке easy-install-пакета) из этого каталога, в котором написано что-то вроде:

Код: Выделить всё

import sys; sys.__plen = len(sys.path)
./html5lib-0.10-py2.5.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

После этого, sys.path выглядит как-то так:

Код: Выделить всё

['', '/home/user/opt/lib/python2.5/site-packages/html5lib-0.10-py2.5.egg', '/home/user/opt/lib/python', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/var/lib/python-support/python2.5', '/var/lib/python-support/python2.5/gtk-2.0', '/home/user/opt/lib/python2.5/site-packages']
Думаю, можно и самому вкрутить путь до egg-файла в sys.path, должно работать.
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

watashiwa_daredeska писал(а):
12.03.2009 13:08
cy6erGn0m писал(а):
12.03.2009 12:30
Не работает sys.path.append
Не то добавляете, не так добавляете и т.п. Как добавляете в sys.path (код)? Что есть по тому пути, который добавляете?

cy6erGn0m писал(а):
12.03.2009 12:40
а target машине хостера установился egg файл, что-то вроде MySQL_python-1.2.2....egg
egg-файл сам по себе не цепляется, насколько я помню. Цепляется pth-файл (у меня easy-install.pth, созданный автоматом при установке easy-install-пакета) из этого каталога, в котором написано что-то вроде:

Код: Выделить всё

import sys; sys.__plen = len(sys.path)
./html5lib-0.10-py2.5.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

После этого, sys.path выглядит как-то так:

Код: Выделить всё

['', '/home/user/opt/lib/python2.5/site-packages/html5lib-0.10-py2.5.egg', '/home/user/opt/lib/python', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/var/lib/python-support/python2.5', '/var/lib/python-support/python2.5/gtk-2.0', '/home/user/opt/lib/python2.5/site-packages']
Думаю, можно и самому вкрутить путь до egg-файла в sys.path, должно работать.


Вот первой строкой вывода index.py печатается содержимое sys.path, а дальше стектрейс, далее проверка наличия всего необходимого в тех местах, которые в sys.path имеются. Я надобавлял кучу вариантов пустей, но ни один не работает.

Код: Выделить всё

[fealot86@cp15 ~]$ www/cgi-bin/index.py
['/home/fealot86/public_html/cgi-bin', '/usr/local/lib/python24.zip', '/usr/local/lib/python2.4', '/usr/local/lib/python2.4/plat-freebsd6', '/usr/local/lib/python2.4/lib-tk', '/usr/local/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/home/fealot86/pypkgs', '/home/fealot86/pypkgs/lib', '/home/fealot86/pypkgs/lib/python2.4', '/home/fealot86/pypkgs/lib/python2.4/site-packages']
Traceback (most recent call last):
  File "www/cgi-bin/index.py", line 13, in ?
    from element_render import element_render
  File "/home/fealot86/public_html/cgi-bin/element_render.py", line 1, in ?
    from image_show_renderer import image_show_renderer
  File "/home/fealot86/public_html/cgi-bin/image_show_renderer.py", line 4, in ?
    from adm import isAdmin
  File "/home/fealot86/public_html/cgi-bin/adm.py", line 5, in ?
    from dao.user import check_session
  File "/usr/local/lib/python2.4/user.py", line 7, in ?
    However, some programs or sites may find it convenient to allow users
  File "/home/fealot86/public_html/cgi-bin/dao/connect.py", line 5, in ?
    import MySQLdb
ImportError: No module named MySQLdb
[fealot86@cp15 ~]$

[fealot86@cp15 ~/pypkgs/lib/python2.4/site-packages]$ pwd
/home/fealot86/pypkgs/lib/python2.4/site-packages
[fealot86@cp15 ~/pypkgs/lib/python2.4/site-packages]$ ls
MySQL_python-1.2.2-py2.4-freebsd-6.3-RELEASE-p5-i386.egg
easy-install.pth
setuptools-0.6c5-py2.4.egg
setuptools.pth
site.py
site.pyc
site.pyo
[fealot86@cp15 ~/pypkgs/lib/python2.4/site-packages]$


[cy6ergn0m@cgmachine dist]$
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение watashiwa_daredeska »

Код: Выделить всё

cat /home/fealot86/pypkgs/lib/python2.4/site-packages/*.pth
покажите
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

watashiwa_daredeska писал(а):
12.03.2009 13:20

Код: Выделить всё

cat /home/fealot86/pypkgs/lib/python2.4/site-packages/*.pth
покажите


Код: Выделить всё

[fealot86@cp15 ~]$ cat /home/fealot86/pypkgs/lib/python2.4/site-packages/*.pth
import sys; sys.__plen = len(sys.path)
./setuptools-0.6c5-py2.4.egg
./MySQL_python-1.2.2-py2.4-freebsd-6.3-RELEASE-p5-i386.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
./setuptools-0.6c5-py2.4.egg
[fealot86@cp15 ~]$


я думаю что питон этот pth не выполняет нифига, потому что он не входит в PYTHONPATH.. а видимо sys.path.append ему даже не намёк на это.

зато если прописать PYTHONPATH, то работает и без sys.path.append, но проблема в том что я не имею контроля над окружением из которого дёргаются эти скрипты.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение watashiwa_daredeska »

Попробуйте вместо простого sys.path.append сделать так.
Вариант 1:

Код: Выделить всё

import os.path, site, sys
site.addsitedir( os.path.expanduser( "~/pypkgs/lib/python%s/site-packages" % (sys.version[:3],) ) )


Вариант 2:
sys.path.append('/home/fealot86/pypkgs/lib/python2.4/site-packages/MySQL_python-1.2.2-py2.4-freebsd-6.3-RELEASE-p5-i386.egg')

UPD: Сорри, expanduser может не работать в cgi. Разверните руками в полный путь.
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: RESOLVED: python, PYTHONPATH, sys.path

Сообщение cy6erGn0m »

О! Ура! Сработало, только я на всякий случай заменил ~ на прямой путь во избежание недоразумений, потому как апач вроде CGI выполняет от имени другого пользователя (правда я не на 100% уверен, не проверял ещё)

Спасибо большое!
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали: