Reputation: 25339
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
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
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
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
Reputation: 21435
You can use virtualenv
for testing Python code while in development as if it was released
Upvotes: 4