Konstantin
Konstantin

Reputation: 25339

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.

Upvotes: 14

Views: 5537

Answers (4)

Wolfgang Fahl
Wolfgang Fahl

Reputation: 15769

There is the console_scripts approach now. See e.g.

entry_points={
      'console_scripts': [
        'wikibackup = wikibot.wikipush:mainBackup',   
        'wikiedit = wikibot.wikipush:mainEdit',
        'wikinuke = wikibot.wikipush:mainNuke',
        'wikipush = wikibot.wikipush:mainPush',
        'wikiupload = wikibot.wikipush:mainUpload',
        'wikiuser = wikibot.wikiuser:main',
      ],
    },

from https://pypi.org/project/py-3rdparty-mediawiki/ (where i am a committer).

If you do a pip install of that package the above scripts will be installed as part of the installation process.

see https://github.com/WolfgangFahl/py-3rdparty-mediawiki/blob/master/setup.py for the full source code of the setup script.

Upvotes: 2

agf
agf

Reputation: 176780

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

Upvotes: 4

S&#248;ren L&#248;vborg
S&#248;ren L&#248;vborg

Reputation: 8751

The simplest way is to configure the right Python path, so Python knows to look for my_package in the current directory.

On Linux (using Bash):

export PYTHONPATH=.
bin/server-run

On Windows:

set PYTHONPATH=.
python bin/server-run

Upvotes: 3

Mihai Maruseac
Mihai Maruseac

Reputation: 21435

You can use virtualenv for testing Python code while in development as if it was released

Upvotes: 4

Related Questions