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 strcture 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 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.
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
You can use virtualenv
for testing Python code while in development as if it was released
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
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.
精彩评论