如何将iPython设置为普通用户的简化命令shell

时间:2013-12-17 22:01:15

标签: python command-line-interface ipython

摘要: 是否可以将iPython设置为普通用户(cd,ls,mkdir,rm等)的基本dos / bash命令行终端,然后公开一些额外的专有命令?

深度: 我在一家视频游戏公司工作,用户从未体验过#34; good"生产管道中的CLI。所以作为回应,我已经工作了一段时间在python中使用cmd.py编写CLI,重新创建常用的dos命令,然后使用我自己的自定义命令对它们进行扩充以执行各种操作,例如:快速跳过预定义生产文件夹,简化的perforce管理命令,使用递归的ant-glob模式查找/导入文件到我们的创作工具......等等......

在这个过程中,我偶然发现了ipython。我不是很熟悉它,但我已经感觉到它应该使用的东西,因为它可以免费提供我想要的东西。它完美地处理了ansi的颜色。所有shell命令都可通过"!"获得,可以使用" |,>,<"所有内置的shell功能都是免费的,好处还在继续......

有一点需要注意的是,我的目标受众很容易受到CLI的威胁...所以当他们输入"更多textfile.txt"作为输入,他们期望打印文件内容的默认dos行为,而不是:

In [42]: more textfile.txt
  File "<ipython-input-42-e442b4ca857b>", line 1
    more file.txt
            ^
SyntaxError: invalid syntax

当然,&#34;!更多textfile.txt&#34;会做他们期望的事情,但我不希望他们必须输入&#34;!&#34;他们将使用大约95%的命令。

所以我正在寻找一种以完全简化的方式推出ipython的方式,在我的理想(可能是幻想)世界中:

  • 所有shell命令(cd,ls / dir,mkdir,more,rm / del等等)都可以在最前面访问,而不需要任何&#34;!&#34;
  • 所有python命令(import,def,class,for,print,while等等)都是不可访问的,除了从预定义的几个专有命令进行各种管道操作,可能会使基本算术命令可访问?

作为奖励:一种在默认ipython和非常克制和简化的命令shell替换版本之间交替的方法我梦想着...... ex:打字&#34;正常&#34;将恢复所有ipython的默认行为......并输入&#34; cli&#34;会回到简化版。

最后的注意事项:我正在寻找的可能是一个傻瓜的差事,我应该坚持在命令shell中使用我自己的笨拙的CLI脚本启动python.exe并称它为一天...但我认为,如果我喜欢iPython在这里做的是远程可能的,那么Stackoverflow就是我能快速得到答案的地方:)

2 个答案:

答案 0 :(得分:3)

IPython用于接近你所要求的东西,它在0.11版本中被删除,因为缺乏使用/测试和兴趣。我认为将其恢复是可以接受的,但是我不确定它将涉及的工作量,因为我们知道架构已经发生了很大的变化。

我将强调你可能想要/不想这样做的一些原因,以及一些替代和技术要点。

  1. 你将永远无法获得IPython的完整真实shell体验 那些不会工作的东西(例如,以2流程架构为例,或者带有破折号的命令)
  2. 防止完全使用Python会非常困难。
  3. 使用别名或魔法定义自己的命令非常简单。 (已在中指出  评论,但并不总是有效
  4. IPython本身正在工作的方式看起来存在的东西是有效的python,如果是这样的话。否则假设它是一个魔术,如果它是sens,将它转换为python语法并执行。然后回退到别名。我猜逻辑可以颠倒过来,但确定smth是否是有效的shell可能很困难。

    您也可以挂钩自己的输入trasformer SageMath在某些地方使用它来进行自定义语法。

    我不确定“交替”部分会很容易,但是IPython非常灵活,输入转换器是协程基础所以应该是可实时修改的,但它仍然可能需要在IPython本身使用modif我想要公开正确的API

    你可能有兴趣看一下写一个完整的IPython“内核”(不要害怕它看起来更简单)。也就是说只是获得用户输入和发回输出的部分,其余部分是免费的。如果您查看IJulia并运行ipython console --profile=julia,则会将其放入julia shell中。你也可以为rubyHaskell等做同样的事情。其他优点是你不需要在python中编写内核,并且它可以与qtconsole,notebook emacs,vim ......以及其他IPython前端一起使用。

    我看到问题被提升了3次,我将补充说IPython是开源的,如果有人来,请添加功能,帮助我们维护我们可以添加它回到了核心。

答案 1 :(得分:0)

一种方法是使用cmd模块并实现您将要全部执行的所有命令。

很简单的例子:

import cmd
import string, sys

class CLI(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = '> '

    def do_hello(self, arg):
        print "hello again", arg, "!"

    def help_hello(self):
        print "syntax: hello [message]",
        print "-- prints a hello message"

    def do_quit(self, arg):
        sys.exit(1)

    def help_quit(self):
        print "syntax: quit",
        print "-- terminates the application"

    # shortcuts
    do_q = do_quit

cli = CLI()
cli.cmdloop()

输出:

$ python cmd-example-1.py

  

帮助

Documented commands (type help <topic>):
========================================
hello           quit

Undocumented commands:
======================
help            q

> hello world
hello again world !
> q