摘要: 是否可以将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的方式,在我的理想(可能是幻想)世界中:
作为奖励:一种在默认ipython和非常克制和简化的命令shell替换版本之间交替的方法我梦想着...... ex:打字&#34;正常&#34;将恢复所有ipython的默认行为......并输入&#34; cli&#34;会回到简化版。
最后的注意事项:我正在寻找的可能是一个傻瓜的差事,我应该坚持在命令shell中使用我自己的笨拙的CLI脚本启动python.exe并称它为一天...但我认为,如果我喜欢iPython在这里做的是远程可能的,那么Stackoverflow就是我能快速得到答案的地方:)
答案 0 :(得分:3)
IPython用于接近你所要求的东西,它在0.11版本中被删除,因为缺乏使用/测试和兴趣。我认为将其恢复是可以接受的,但是我不确定它将涉及的工作量,因为我们知道架构已经发生了很大的变化。
我将强调你可能想要/不想这样做的一些原因,以及一些替代和技术要点。
IPython本身正在工作的方式看起来存在的东西是有效的python,如果是这样的话。否则假设它是一个魔术,如果它是sens,将它转换为python语法并执行。然后回退到别名。我猜逻辑可以颠倒过来,但确定smth是否是有效的shell可能很困难。
您也可以挂钩自己的输入trasformer SageMath在某些地方使用它来进行自定义语法。
我不确定“交替”部分会很容易,但是IPython非常灵活,输入转换器是协程基础所以应该是可实时修改的,但它仍然可能需要在IPython本身使用modif我想要公开正确的API
你可能有兴趣看一下写一个完整的IPython“内核”(不要害怕它看起来更简单)。也就是说只是获得用户输入和发回输出的部分,其余部分是免费的。如果您查看IJulia并运行ipython console --profile=julia
,则会将其放入julia shell中。你也可以为ruby和Haskell等做同样的事情。其他优点是你不需要在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