2013-12-17 13 views
5

Sommario: E 'possibile configurare ipython a guardare come un terminale di riga di comando DOS di base/bash per l'utente medio (cd, ls, mkdir, rm ... ecc.), e quindi esporre alcuni comandi proprietari extra?Come configurare ipython come una shell di comando semplificato per l'utente medio

Approfondimenti: Io lavoro per una società di videogiochi in cui gli utenti non hanno mai sperimentato una CLI "buono" in una pipeline di produzione. Quindi in risposta ho lavorato per un po 'di tempo scrivendo una CLI usando cmd.py in python, ricreando i comandi DOS comunemente usati e poi aumentandoli con i miei comandi personalizzati per fare varie cose, es: saltare rapidamente attraverso le cartelle di produzione predefinite , comandi di gestione perforce semplificati, trovare/importare i file con pattern ant-glob ricorsivi nel nostro strumento di creazione ... ecc. ecc ...

Nel mezzo del processo mi sono imbattuto in ipython. Non ho molta familiarità con esso, ma sento già che è quello che dovrei usare, in quanto fa un sacco di quello che voglio gratuitamente. Gestisce perfettamente i colori ansi. Tutti i comandi della shell sono disponibili tramite, è possibile utilizzare "!" "|,>, <" e tutti costruiti in funzioni di shell per libero, i vantaggi vanno avanti e avanti ...

L'unico avvertimento è che il mio pubblico mirato è facilmente intimiditi dalla CLI di ... e così quando si digita "più textfile.txt" come input, si aspettano che il comportamento predefinito dos di stampare il contenuto del file, e non:

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

Naturalmente, " ! more textfile.txt "farebbe quello che si aspetta, ma non voglio che debbano digitare"! " per essenzialmente il 95% dei comandi che avrebbero usato.

Quindi sto cercando un modo per lanciare ipython in maniera del tutto semplificata dove nel mio ideale (fantasia forse) mondo:

  • Tutti i comandi di shell (cd, ls/dir, mkdir, più , rm/del, ecc ...) sarebbero accessibili in prima linea senza "!"
  • Tutti i comandi python (import, def, class, for, print, while, etc ...) sarebbero inaccessibili, ad eccezione di alcuni comandi proprietari predefiniti per eseguire varie operazioni di pipeline, forse lasciare accessibili i comandi aritmetici di base?

E come bonus: un modo per alternare ipython di default e la versione di sostituzione shell di comando molto sobrio e semplificato sto sognando ... Es: digitando "normale" sarebbe ripristinare tutti il ​​comportamento predefinito di ipython. .. e digitando "cli" si tornerebbe alla versione semplificata.

Nota finale: Quello che sto cercando è probabile che prendono in giro e ho probabilmente dovrebbe attaccare con il lancio python.exe in una shell di comando con il mio modo di scrivere goffo CLI e chiamare un giorno ... Ma io Ho capito che se quello che vorrei che iPython faccia da remoto fosse possibile, Stackoverflow è dove troverei la risposta rapidamente :)

+0

Mi sembra che quello che vuoi sia scrivere la tua shell che ha le caratteristiche specifiche che vuoi e non le altre? Ipython potrebbe essere un buon modello di codice per questo. – aestrivex

+0

C'è qualcos'altro oltre a '!' Che non vuoi apparire in questa tua CLI? Anche escludendo questo indicatore speciale che ciò che si sta digitando un comando può imporre alcuni vincoli sulla nominare le cose (file, funzioni etc.). –

+0

dai un'occhiata a% alias'. Digitare '% rehashx' allora avete tutti i binari nel tuo percorso come, pure, gli alias e comandi come' più file.txt' funziona. –

risposta

0

Un modo è usare il modulo cmd e implementare tutti i comandi che verranno assegnati.

esempio molto semplice:

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

uscita:

$ python cmd-esempio-1.py

aiuto

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

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

> hello world 
hello again world ! 
> q 
+0

non stai rispondendo alla mia domanda. So come usare cmd.py come indicato nella seconda frase del paragrafo intitolato "Approfondimento". Ma è limitante e mi richiede di scrivere wrapper per gestire le piping e ogni singola funzione del terminale di comando ...ex: dir * .txt> textfile.txt. Quello che sto chiedendo è per i modi, se ce ne sono, per far sembrare iPython un ambiente simile a dos cmd.exe. – Fnord

3

IPython utilizzare per avere qualcosa di simile a quello che stai chiedendo, è stato rimosso in 0,11 versione per mancanza di uso/testing e interesse. Suppongo che sia fattibile riportarlo indietro, ma non sono sicuro della mole di lavoro che comporterà sapendo che l'architettura è cambiata un po '.

Sottolineerò alcune delle ragioni per cui potresti volere/non voler andare in questo modo, così come qualche punto di vista tecnico e alternativo.

  1. si potrà mai ottenere una piena esperienza vera e propria shell con IPython sarete sempre venire attraverso cose che non funzionerà (getpass nell'architettura 2 processo per esempio, o il comando con il precipitare in loro)
  2. impediscono il pieno utilizzo di Python sarà davvero difficile.
  3. definire i propri comandi con alias o magici è semplicissimo. (Già ricordato al
    commento, ma wil non funziona sempre

Il modo IPython si sta lavorando è alla ricerca wether qualcosa esiste è valida python, in tal caso l'esecuzione. In caso contrario, supponiamo che si tratta di una magia, se fa sens, transfom alla sintassi python ed eseguire. Poi, ripiegate sulla alias. Credo che la logica può essere invertita, ma per determinare se si dovrebbe occupare è shell valida potrebbe essere difficile.

è inoltre possibile collegare il proprio ingresso trasformatore SageMath è dooing in qualche posti per consentire la sintassi personalizzata

Non sono sicuro che "alter "la parte sarà facile, ma IPython è davvero flessibile, il trasformatore di ingresso è di base di Coroutine, quindi dovrebbe essere modificabile dal vivo, ma probabilmente richiederà modif in IPython stesso, penso che esporre l'API corretta.

Potresti essere interessato a scrivere un "kernel" IPython completo (non temere sia più semplice che sembri). Vale a dire solo la parte che ottiene l'input dell'utente e restituisce l'output, il resto viene fornito gratuitamente. Se guardi allo IJulia e corri allo ipython console --profile=julia sei caduto in una shell di julia. e puoi fare lo stesso per ruby e Haskell ... ecc. Altri vantaggi sono che non è necessario scrivere il kernel in python, e che funzionerà sullo scaffale con qtconsole, notebook emacs, vim ... e altri frontend IPython.

io come vedo che la questione è stata upvoted 3 volte, io aggiungo che IPython è open source, e se la gente viene, aggiungere la funzionalità di nuovo e aiutarci mantenimento probabilmente possiamo aggiungere indietro nel nucleo.

+0

grazie per questo input. Molto utile. Vedrò cosa posso fare con il kernel quando ho un po 'di tempo. – Fnord

+0

Non esitate a chiedere su [email protected] o su github, saremo lieti di indicarvi più risorse. – Matt