python-devel-tools

wrobell wrobell w pld-linux.org
Sob, 1 Maj 2004, 16:09:38 CEST


On Fri, Apr 30, 2004 at 10:32:52AM +0200, Jacek Konieczny wrote:
> On Thu, Apr 29, 2004 at 11:21:53PM +0200, wrobell wrote:
> > On Wed, Apr 28, 2004 at 02:17:36PM +0200, Jacek Konieczny wrote:
> > > On Tue, Apr 27, 2004 at 09:37:56PM +0200, wrobell wrote:
> > > > tak sie zastanawiam... moze po prostu wyciac dodawanie aktualnej sciezki
> > > > skryptu do sys.path w pythonie? czy to jest tak naprawde potrzebne?
> > > 
> > > To jest część standardu.
> > pytanie gdzie opisanego? :-)
> > 
> > http://docs.python.org/lib/module-site.html
> > 
> > > Tego nie można tak po prostu wywalić.
> > powoduje to jednak okreslone problemy, jak sie okazuje.
> 
> Oraz daje wymierne korzyści (odpalanie skryptów bez instalacji).
> 
> > nic z automatu sie tutaj nie szuka. jak wrzucisz biblioteke .so do
> > /usr/lib/dziwnasciezka, to musisz sobie dokonfigurowac system
> > lub ustawic LD_LIBRARY_PATH albo kombinowac z LD_PRELOAD (czy jak jej tam...).
> 
> Ale python z automatu nie szuka "gdzie popadnie", ani nawet w $PATH. On
> szuka tam gdzie leży skrypt.
i to jest blad, np.:

stworz skrypt o nazwie getpass.py i umiesc go w $HOME/bin:

        import getpass
        passwd = getpass.getpass()

dlaczego getpass.py? jest to intyuicyjne dla mnie. skrypt jest
napisany w pythonie, wiec ma rozszerzenie .py, a nazywa sie
getpass, poniewaz chce pobrac haslo od uruchamiajacego ten skrypt

problem nr 1:

    > python bin/getpass.py
    Traceback (most recent call last):
      File "bin/getpass.py", line 1, in ?
        import getpass
      File "/home/users/wrobell/bin/getpass.py", line 3, in ?
        passwd = getpass.getpass()
    TypeError: 'module' object is not callable

imho, uzytkownik nie moze byz zmuszany w tym przypadku do zmiany
nazwy skryptu. malo tego, python zawiera duzo roznych modulow
i kazdy ma sobie teraz robic blacklist-e jak nie moga sie nazywac
jego skrypty (conajmniej 200 nazw w moim systemie)?


problem nr 2: jesli sciagniesz dowolny program napisany w pythonie, ktory
korzysta z modulu getpass i wrzucisz ten program do $HOME/bin, to program
sie nie uruchomi w _najlepszym_przypadku_

jak dla mnie mamy wiecej z obecnym zachowaniem pythona problemow niz pozytku.

> Przed chwilą sprawdziłem i okazuje się, że python szuka tam gdzie
> faktycznie leży skrypt, nawet gdy ten został odpalony przez symlink. 
> W tym momencie sprawa bardzo się ułatwia - właściwy skrypt dajemy do
> innego katalogu - tam gdzie są dodatkowe modułu dla tego skryptu lub do
> jakiegoś uniwersalnego "worka" na skrypty w pythonie (lepiej nie w
> /usr/{lib,share}/python, jeśli to nie jest moduł/pakiet do użycia przez
> inne aplikacje), a w $PATH dawać jedynie symlinki do skryptu. Żadnego
> $PYTHONPATH nie trzeba wtedy ustawiać, ani sys.path modyfikować w
> skrypcie. IMHO bomba.

wszystko swietnie dla prostych przypadkow. niestety, wszystko jest bardziej
skomplikowane i w przypadku takich systemow jak windows, gdzie programy
sa wrzucane do swoich wlasnych katalogow, moze jest to wygodne, ale w przypadku
standardow unix-owych powoduje to realne i trudne do obejscia (tworzenie
wrapperow i kombinajce z sys.path w porownaniu do ustawiania PYTHONPATH) problemy

> Przy okazji dowiedziałem się że nie muszę kombinować w moich projektach
> pythonowych z modyfikacją sys.path, aby skrypt umieszczony w $PATH
> znajdował swoje moduły :-)

do czasu az wrzucisz sobie jakis skrypt do $HOME/bin :-)

    wrobell <wrobell w pld-linux.org>



Więcej informacji o liście dyskusyjnej pld-devel-pl