NP! Sometimes it's just easier to explain with code
On Sat, Aug 24, 2019 at 5:30 PM Michael Hooreman <[email protected]> wrote: > > Tanks a lot Wes, > > I know what I will do on Monday :-) > > Le sam. 24 août 2019 23:22, Wes Turner <[email protected]> a écrit : >> >> ```python >> !cat ../../bin/example >> ``` >> >> #!/home/user/-wrk/-ve37/s_example/bin/python3 >> # EASY-INSTALL-ENTRY-SCRIPT: 'example','console_scripts','example' >> __requires__ = 'example' >> import re >> import sys >> from pkg_resources import load_entry_point >> >> if __name__ == '__main__': >> sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) >> sys.exit( >> load_entry_point('example', 'console_scripts', 'example')() >> ) >> >> On Sat, Aug 24, 2019 at 5:16 PM Wes Turner <[email protected]> wrote: >> > >> > https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html#the-console-scripts-entry-point >> > >> > On Sat, Aug 24, 2019 at 5:11 PM Wes Turner <[email protected]> wrote: >> > > >> > > # Python packaging, setup.py, console_scripts entrypoints, and >> > > __main__.py >> > > >> > > >> > > ```python >> > > !ls ** >> > > ``` >> > > >> > > examplenb.ipynb requirements.txt setup.py >> > > >> > > example: >> > > __init__.py __main__.py thecode.py >> > > >> > > >> > > >> > > ```python >> > > !cat setup.py >> > > ``` >> > > >> > > >> > > from setuptools import setup >> > > >> > > setup(name='example', >> > > version='0.1', >> > > description='Example', >> > > url='http://github.com/.../...', >> > > author='Example', >> > > author_email='[email protected]', >> > > license='...', >> > > packages=['example'], >> > > zip_safe=False, >> > > entry_points={ >> > > 'console_scripts': [ >> > > 'example = example.thecode:main' >> > > ]} >> > > ) >> > > >> > > >> > > >> > > ```python >> > > !cat example/thecode.py >> > > ``` >> > > >> > > >> > > import sys >> > > >> > > def main(argv=None): >> > > if argv is None: >> > > argv = sys.argv >> > > print("argparse here", argv) >> > > >> > > >> > > >> > > ```python >> > > !cat example/__main__.py >> > > ``` >> > > >> > > >> > > import sys >> > > >> > > from .thecode import main >> > > >> > > def othermain(): >> > > print("othermain") >> > > return main(sys.argv) >> > > >> > > if __name__ == "__main__": >> > > othermain() >> > > >> > > >> > > >> > > ```python >> > > !cat ./requirements.txt >> > > ``` >> > > >> > > -e . >> > > >> > > >> > > >> > > ```python >> > > !pip install -r ./requirements.txt >> > > # (this is equivalent to `pip install -e .`) >> > > ``` >> > > >> > > Obtaining file:///home/user/-wrk/-ve37/s_example/src/s_example >> > > (from -r ./requirements.txt (line 1)) >> > > Installing collected packages: example >> > > Found existing installation: example 0.1 >> > > Uninstalling example-0.1: >> > > Successfully uninstalled example-0.1 >> > > Running setup.py develop for example >> > > Successfully installed example >> > > >> > > >> > > >> > > ```python >> > > !ls ** >> > > ``` >> > > >> > > examplenb.ipynb requirements.txt setup.py >> > > >> > > example: >> > > __init__.py __main__.py thecode.py >> > > >> > > example.egg-info: >> > > dependency_links.txt not-zip-safe SOURCES.txt >> > > entry_points.txt PKG-INFO top_level.txt >> > > >> > > >> > > >> > > ```python >> > > # This is generated when you `pip install -e` >> > > !cat ./example.egg-info/entry_points.txt >> > > ``` >> > > >> > > [console_scripts] >> > > example = example.thecode:main >> > > >> > > ```python >> > > # this runs the 'example' console_scripts entry_point >> > > !example >> > > ``` >> > > >> > > argparse here ['/home/user/-wrk/-ve37/s_example/bin/example'] >> > > >> > > >> > > >> > > ```python >> > > # this runs example/__main__ >> > > !python -m example >> > > ``` >> > > >> > > othermain >> > > argparse here >> > > ['/home/user/-wrk/-ve37/s_example/src/s_example/example/__main__.py'] >> > > >> > > >> > > ... >> > > >> > > When you want the project to be reproducible: >> > > >> > > - you have tests (eg in tests/) >> > > - you have a requirements.txt that lists exact versions of all >> > > dependencies >> > > - you build the entire environment (including any requisite OS packages) >> > > from zero (with a virtualenv and/or docker), then run the tests >> > > >> > > There are a number of cookiecutters (project templates) >> > > which have the whole project setup: >> > > >> > > - >> > > https://cookiecutter.readthedocs.io/en/latest/readme.html#available-cookiecutters >> > > - cookiecutter-pypackage includes pytest setup >> > > - https://cookiecutter.readthedocs.io/en/latest/readme.html#data-science >> > > - >> > > https://cookiecutter.readthedocs.io/en/latest/readme.html#reproducible-science >> > > >> > > I prepared this as a Jupyter notebook, then did 'Save as' > 'Markdown'. >> > > Because it has a requirements.txt, if I put this code in a git repo >> > > and launch it in >> > > mybinder.org (repo2docker), it will build a docker container (also >> > > containing jupyter) >> > > and launch a free cloud instance; so that others can review the code >> > > and notebooks >> > > in a read/write environment (where changes are not persisted because >> > > the instance is later just deleted) >> > > >> > > - REES: Reproducible Environment Specification >> > > https://repo2docker.readthedocs.io/en/latest/specification.html >> > > >> > > - environment.yml - Install a Python environment >> > > - Pipfile and/or Pipfile.lock - Install a Python environment >> > > - requirements.txt - Install a Python environment >> > > - setup.py - Install Python packages >> > > - Project.toml - Install a Julia environment >> > > - REQUIRE - Install a Julia environment (legacy) >> > > - install.R - Install an R/RStudio environment >> > > - apt.txt - Install packages with apt-get >> > > - DESCRIPTION - Install an R package >> > > - manifest.xml - Install Stencila >> > > - postBuild - Run code after installing the environment >> > > - start - Run code before the user sessions starts >> > > - runtime.txt - Specifying runtimes >> > > - default.nix - the nix package manager >> > > - Dockerfile - Advanced environments _______________________________________________ Python-ideas mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/[email protected]/message/MOII7W5YRH7HIXV3LCHYOOB6XAKYZ3VD/ Code of Conduct: http://python.org/psf/codeofconduct/
