在jupyter notebook单元格中使用click库

Opp*_*ppy 5 python-3.x jupyter-notebook

有没有办法在Jupyter笔记本单元格中使用点击库?我想在笔记本中将标志传递给我的Jupyter笔记本代码,以使其更顺畅地转换为独立脚本.例如,使用Jupyter笔记本单元格中的OptionParser:

from optparse import OptionParser
import sys


def main():
    parser = OptionParser()
    parser.add_option('-f', '--fake',
                    default='False',
                help='Fake data')
    (options,args) = parser.parse_args()
    print('options:{} args: {}'.format(options, args))
    if options.fake:
        print('Fake detected')

def test_args():

    print('hello')

if __name__ == '__main__':

    sys.argv = ['--fake', 'True' '--help']
    main()
Run Code Online (Sandbox Code Playgroud)

输出:选项:{'fake':'False'} args:['True - help']检测到伪造

使用点击库,我收到一串错误.我从Jupyter笔记本单元运行此代码:

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
            help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
Run Code Online (Sandbox Code Playgroud)

输出(截断):

UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-6-ad31be7bf0fe> in <module>()
    12 if __name__ == '__main__':
    13     sys.argv = ['--count', '3']
---> 14     hello()

~/.local/lib/python3.6/site-packages/click/core.py in __call__(self, *args, **kwargs)
    720     def __call__(self, *args, **kwargs):
    721         """Alias for :meth:`main`."""
--> 722         return self.main(*args, **kwargs)
    723 
    724 
...
257 
    258     if message:
--> 259         file.write(message)
    260     file.flush()
    261 

UnsupportedOperation: not writable
Run Code Online (Sandbox Code Playgroud)

Mik*_*ler 4

您可以使用%%pythonmagic 命令来启动一个新的 Python 进程:

%%python

import sys
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
            help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    with open('echo.txt', 'w') as fobj:
        for x in range(count):
            click.echo('Hello %s!' % name)

if __name__ == '__main__':
    # first element is the script name, use empty string instead
    sys.argv = ['', '--name', 'Max', '--count', '3']
    hello()
Run Code Online (Sandbox Code Playgroud)

输出:

Hello Max!
Hello Max!
Hello Max!
Run Code Online (Sandbox Code Playgroud)