2011-07-23 17 views
7

Rozwijam aplikację Pythona, którą postanowiłem przekształcić w pakiet do zainstalowania przez easy_install lub pip później. Użyłem wyszukiwarki, aby znaleźć kilka dobrych źródeł o strukturze katalogów dla pakietów Pythona. Patrz: this answer lub this post.Skrypty w pakiecie Pythona

stworzyłem następujące struktury (I zostały pominięte kilka plików na liście, aby strcture być bardziej jasne)

 
Project/ 
|-- bin/ 
|-- my_package/ 
| |-- test/ 
| | |-- __init__.py 
| | |-- test_server.py 
| |-- __init__.py 
| |-- server.py 
| |-- util.py 
|-- doc/ 
| |-- index.rst 
|-- README.txt 
|-- LICENSE.txt 
|-- setup.py   

Potem stworzyłem wykonywalny skrypt server-run

 
#!/usr/bin/env python 
from my_package import server 

server.main() 

które umieściłem w bin katalogu. Jeśli zainstaluję pakiet z python setup.py install lub przez pip/easy_install wszystko działa poprawnie, mogę uruchomić server-run i mój serwer zacznie obsługiwać przychodzące żądania.

Ale moje pytanie jest jak test, który server-run prace w środowisku programistycznym (bez uprzedniej instalacji my_package)? Również chcę użyć tego skryptu do uruchomienia najnowszego kodu serwera dla celów programistycznych.

Rozwój dzieje się w Project katalogu więc otrzymuję ImportError jeśli biegnę ./bin/server-run

 
[email protected]:~/dev/Project/$ ./bin/server-run 
Traceback (most recent call last): 
    File "./bin/server-run", line 2, in 
    import my_package 
ImportError: No module named my_package 

to możliwe, aby zmodyfikować bin/server-run skrypt tak to będzie działać, jeśli uruchomię go z innego folderu gdzieś w systemie plików (niekoniecznie od Project reż.)? Zauważ też, że chcę używać (jeśli jest to możliwe) tego samego skryptu do uruchamiania serwera w środowisku produkcyjnym.

Odpowiedz

3

Potrzebujesz względnego importu. Spróbuj

from .. import mypackage 

lub

from ..mypackage import server 

Dokumentacja jest tutaj

http://docs.python.org/tutorial/modules.html#intra-package-references

te działają na Python 2.5 lub nowszej.

Aby to zrobić tylko w wersji rozwojowej, spróbuj:

try: 
    from my_package import server 
except ImportError: 
    from ..my_package import server 
+0

Ale jeśli mogę użyć tego kodu 'serwera run' nie będzie działać po instalacji pakietu. – Alik

+0

Zaktualizowany sposób, aby najpierw wypróbować wersję normalną. – agf

+0

Huh. Zapomniałem o wyjątku ImportException :) Dzięki! – Alik

4

Można użyć virtualenv dla kodu badania Pythona podczas rozwoju, jak gdyby został zwolniony

2

Najprostszym sposobem jest skonfigurowanie prawo Ścieżka Pythona, więc Python wie, aby szukać my_package w bieżącym katalogu.

W systemie Linux (przy użyciu bash):

export PYTHONPATH=. 
bin/server-run 

W systemie Windows:

set PYTHONPATH=. 
python bin/server-run