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/

Reply via email to