1

我喜欢在 ipython 笔记本中进行开发,但是当我想编写一个读取命令行参数的 main() 函数时遇到问题(例如,使用 OptionParser)。我希望能够将代码导出到 .py 文件并从命令行运行它,但我还没有找到一种方法让 main() 既可以在带有预定义参数的笔记本中运行,也可以从命令行运行使用 python 和命令行参数。秘诀是什么?

如果不清楚,我想做这样的事情:

if __name__ == '__main__':
    # if in the notebook
    vals = {'debug':True, 'tag_file': 't.tags'}
    options = Object()
    for k,v in vals.items():
        options.setattr(k,v)
    args = 'fname1.txt'
    # if running as a command line python script
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option('-d','--debug',action='store_true',dest='debug')
    parser.add_option('-t','--tags',action='store',dest='tag_file')
    options,args = parser.parse_args()
4

2 回答 2

1

您无法确定您是在 IPython notebook 还是 qtconsole 或简单的 IPython shell 中,原因很简单,这 3 个可以同时连接到同一个内核。

这就像问,用户正在输入的当前键是什么颜色。您可以通过查看插入的 USB 设备并在 Internet 上查找图像并猜测键盘颜色来获得它,但不能保证它是准确的,也不能保证它不会改变,并且用户可以插入多个键盘,甚至彩绘键盘。

笔记本也一样,即使你确定你在 ZMQKernel,你是在 qtconsole 还是 webserver 上说话?再次,您发现您正在与网络服务器交谈,您是在与 JS 还是 Emacs 交谈?等等等等。

你唯一能做的,就是询问用户。

什么是可靠的,是测试你是否在 IPython 中。


如果你真的想要一种方法,直到现在,笔记本是唯一可以显示 Javascript 的东西。并且javascript可以在pyton中执行代码。因此,您也许可以创建一些显示 JS 的东西,这些 JS 将信息发送回内核。并且使用线程和计时器,您可以说您不在笔记本中(但您将遇到竞争条件)。

于 2013-06-03T20:33:05.450 回答
0

不要担心区别。只需设置默认值,除非它们被命令行覆盖,否则请使用它们。

if __name__ == '__main__':

    parser = OptionParser()
    parser.add_option('-d', '--debug', action='store_true', dest='debug',
                      default=True)
    parser.add_option('-t','--tags',action='store',dest='tag_file',
                      default='t.tags')
    options, args = parser.parse_args()
    if not args:
        args = ['fname1.txt']
于 2013-06-03T21:28:23.397 回答