Python: modules and packaging - why isn't __init__.py file executed before __main__.py?

module, python, python-module

Solution

Do I have to import these functions into `__main__` somehow?

Yes. Only items in `builtins` are available without an import. Something like:

from myprog import func1, func2

should do the trick.

If you don't have `myprog` installed in the normal python path then you can work around it with something like:

import sys
import os
path = os.path.dirname(sys.modules[__name__].__file__)
path = os.path.join(path, '..')
sys.path.insert(0, path)
from myprog import function_you_referenced_from_init_file

Which, quite frankly, is horrid.

I would suggest going with MartijnPieters suggestion and put the `-m` on the command line, in which case `__main__.py` can look like:

from myprog import function_you_referenced_from_init_file

Problem

I have a python program that is entirely contained in a directory with the following structure: ``` myprog/ ├── __init__.py ├── __main__.py ├── moduleone.py └── moduletwo.py ``` I would like to be able to package this and distribute it so that another developer can do `pip install -e /path/to/git/clone/of/myprog` and can then import myprog in his own programs and do cool stuff with it. I would also like to be able to run myprog at the command line as follows: ``` PROMPT> python myprog ``` When I do this, I expect python to execute the `__main__.py` module, which it does. However, this module makes references to some functions that are declared in `__init__.py` and which need to be available both when the program is run at the command line and when it is imported by another program. However, I'm getting the following error: ``` NameError: name 'function_you_referenced_from_init_file' is not defined ``` Do I have to import these functions into `__main__.py` somehow? I tried a simple example as follows: ``` PROMPT> cat myprog/__init__.py def init_myprog(): print 'running __init__.init_myprog()' PROMPT> cat myprog/__main__.py import myprog print 'hi from __main__.py' myprog.init_myprog() PROMPT> ls -l myprog total 16 -rw-r--r-- 1 iit 63B Aug 30 11:40 __init__.py -rw-r--r-- 1 iit 64B Aug 30 12:11 __main__.py PROMPT> python myprog Traceback (most recent call last): File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/Users/jon/dev/myprog/__main__.py", line 1, in <module> import myprog ImportError: No module named myprog ```

Original source

Related problems