2013-06-03 171 views
1

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

在这种不明确的情况下,我愿做这样的事情:

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() 

回答

1

你不能确定你是在IPython的笔记本电脑或qtconsole,或简单IPython的外壳,很简单因为3可以同时连接到同一个内核。

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

它与笔记本电脑是一样的,即使你确定你在ZMQKernel中,你是在向qtconsole还是网络服务器求助?再一次,你发现你正在和网络服务器通话,你在和JS还是Emacs交谈?等等等等。

你可以做的唯一的事情,你可以问用户。

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


如果你真的reeaaalllyy想办法,因为到现在为止,笔记本电脑是可以显示JavaScript中的唯一的事情。 JavaScript可以在pyton中执行代码。所以你可能能够创建显示JS的东西,将信息发送回内核。并且使用线程和计时器,你可以说你不在笔记本中(但你会有竞争状态)。

+0

我确定。如何测试我是否在IPython中?在命令行运行时,我将使用python,而不是ipython。 – user1427057

+0

谢谢,鉴于此提示,我通过编写in_ipython()函数(从stackoverflow文章)找到答案。我在这里重新发布代码:直列'高清in_ipython(): 尝试: __IPYTHON__ 除了NameError: 返回False 其他: 返回TRUE; – user1427057

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'] 
+1

parser.parse_args()从IPython的笔记本采用了SystemExit中运行时失败: 2和“用法:-c [选项]”消息。这就是我发布这个问题的原因。 – user1427057

+0

如果将明确的空列表传递给'parse_args()',会发生什么?我不熟悉'ipython'笔记本,但是访问'sys.argv'可能只是一个问题。如果这没什么区别,我会删除这个答案。 – chepner