Скрипты в пакете Python - PullRequest
       48

Скрипты в пакете Python

8 голосов
/ 23 июля 2011

Я разрабатываю приложение на Python, которое я решил превратить в пакет, который будет установлен easy_install или pip позже. Я использовал поиск, чтобы найти несколько хороших источников о структуре каталогов для пакетов Python. См. этот ответ или этот пост .

Я создал следующую структуру (я пропустил несколько файлов в списке, чтобы структура была более понятной)

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           

После этого я создал исполняемый скрипт server-run

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

server.main()

который я поместил в каталог bin. Если я установлю свой пакет с python setup.py install или с помощью pip/easy_install, все будет работать нормально, я смогу запустить server-run, и мой сервер начнет обрабатывать входящие запросы.

Но у меня вопрос, как проверить, что server-run работает в среде разработки ( без предварительной установки my_package)? Также я хочу использовать этот скрипт для запуска самого последнего серверного кода в целях разработки.

Разработка происходит в каталоге Project, поэтому я получаю ImportError, если я запускаю ./bin/server-run

user@host:~/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

Можно ли изменить скрипт bin/server-run, чтобы он работал, если я запустил его из другой папки в файловой системе (не обязательно из Project dir)? Также обратите внимание, что я хочу использовать (если это возможно) тот же сценарий для запуска сервера в производственной среде.

Ответы [ 3 ]

5 голосов
/ 23 июля 2011

Вам нужен относительный импорт. Попробуйте

from .. import mypackage

или

from ..mypackage import server

Документация здесь

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

Они работают на Python 2.5 или новее.

Чтобы сделать это только в версии для разработчиков, попробуйте:

try:
    from my_package import server
except ImportError:
    from ..my_package import server
4 голосов
/ 23 июля 2011

Вы можете использовать virtualenv для тестирования кода Python во время разработки, как если бы он был выпущен

2 голосов
/ 08 августа 2011

Самый простой способ - настроить правильный путь Python, чтобы Python знал, что нужно искать my_package в текущем каталоге.

В Linux (с использованием Bash):

export PYTHONPATH=.
bin/server-run

В Windows:

set PYTHONPATH=.
python bin/server-run
...