pythonpackagingdirectory-structureproject-structure

Scripts in python package


I develop python application which I decided to turn into package to be installed by easy_install or pip later. I've used search to find several good sources about directory structure for python packages See this answer or this post.

I created following structure (I've omitted several files in the list to make structure be more clear)

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           

After that I created executable script server-run

#!/usr/bin/env python
from my_package import server
    
server.main()

which I placed into bin directory. If I install my package with python setup.py install or via pip/easy_install everything works fine, I can run server-run and my server starts to handle incoming requests.

But my question is how to test that server-run works in development environment (without prior installation of my_package)? Also I want to use this script to run latest server code for dev purposes.

Development happens in Project directory so I am getting ImportError if I run ./bin/server-run

user@host:~/dev/Project/$ ./bin/server-run
Traceback (most recent call last):
  File "./bin/server-run", line 2, in <module>
    import my_package
ImportError: No module named my_package

Is it possible to modify bin/server-run script so it will work if I run it from another folder somewhere in the filesystem (not necessarily from Project dir)? Also note that I want to use (if it is possible to achieve) the same script to run server in production environment.


Solution

  • You need relative imports. Try

    from .. import mypackage
    

    or

    from ..mypackage import server
    

    The documentation is here

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

    These work on Python 2.5 or newer.

    To do it only in the development version, try:

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