I have a module which I'm going to distribute as standalone app. The module has the following structure:
$ tree -L 2 ./
./
├── mymodule
│ ├── __main__.py
│ ├── fun.py
└── mymodule.pyz
mymodule/__main__.py
contains next lines:
#!/usr/bin/env python
import argparse
import sys
import os.path
from mymodule.fun import Fun
def main():
sys.stdout.write('main is running')
Fun().run()
if __name__ == '__main__':
main()
mymodule/fun.py
contains next lines:
#!/usr/bin/env python
import sys
class Fun:
"""FUN"""
def __init__(self):
pass
def run(self):
sys.stdout.write("fun")
If I run module using $ python -m mymodule
the output is
main is runningfun
But if I create a standalone app using $ python -m zipapp -p "/usr/bin/evn python" mymodule
and run it $ python mymodule.pyz
I got error
Traceback (most recent call last):
File "/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "mymodule.pyz/__main__.py", line 6, in <module>
ModuleNotFoundError: No module named 'mymodule'
What is wrong with import
?
UPD: sys.path output
$ python -m mymodule
['', '/Users/igork/.pyenv/versions/3.6.4/lib/python36.zip', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/lib-dynload', '/Users/igork/.local/lib/python3.6/site-packages', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/site-packages']
$ python mymodule.pyz
['mymodule.pyz', '/Users/igork/.pyenv/versions/3.6.4/lib/python36.zip', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/lib-dynload', '/Users/igork/.local/lib/python3.6/site-packages', '/Users/igork/.pyenv/versions/3.6.4/lib/python3.6/site-packages']
First of all I run the app using wrong command, the correct is:
To create single file app and run it I need to use:
To run unit tests I need to use:
But unit tests were failing because of error:
To fix the error I added next lines to
tests/__init__.py
file:To summarize: the structure of the project I use is:
file
tests/test_fun.py
is:file
mymodule/__main__.py
is: