Création D'un programme de Terminal Avec Python

j'ai récemment commencé à apprendre le python. J'ai créé quelques webapps de base avec Django et j'ai écrit quelques scripts simples. Après avoir utilisé VIM comme IDE Python je suis vraiment tombé amoureux des "programmes terminaux" (y a-t-il un terme officiel pour cela?). En ce moment, je suis capable de faire des choses simples comme demander à quelqu'un de vieillir et l'imprimer sur l'écran. Toutefois cela revient à exécuter .py script et après ce script est fait normale bash retour. Je voudrais créer un programme que je peux courir à partir de la ligne de commande et qui permettrait la même expérience utilisateur que VIM (celui que vous ouvrez et fermez). Par exemple, j'ai créé un script simple pour importer des flux RSS. Ce serait cool si je pouvais ouvrir mon terminal taper le nom de mon programme -> le programme s'ouvrirait -> alors je voudrais utiliser des commandes comme :findsomething. Avoir une réelle interaction avec mon programme.

Pour conclure:

  • Comment pourrais-je aller sur la création d'un tel programme?
  • Quels sont les types de modules, livres ou site que vous recommandez
24
demandé sur Niels 2013-06-28 00:32:16
la source

5 ответов

Un vrai programme de ligne de commande est quelque chose dans la veine de ls ou grep; il est lancé à partir de la ligne de commande, mais il est non-interactif et peut être utilisé dans les pipelines et combiné avec d'autres programmes. Un programme de ligne de commande typique n'a pas d'expérience utilisateur interactive, au lieu de s'en remettre à l'historique de shell et au fichier init pour la personnalisation.

Ce que vous voulez créer est un malédictions application, qui utilise pleinement les capacités de l'ATS interactif plate-forme, pour le meilleur ou pour le pire. Pour ce faire, rechercher malédictions.

18
répondu user4815162342 2013-06-28 00:40:24
la source

Sur un *nix système (linux/unix),

si vous avez:

$ chmod 0744 your_file.py

-rwxr--r--   your_file.py

et ajoute le chemin à python comme première ligne de your_file.py:

#!/usr/bin/python

ou (dans mon cas):

#!/usr/local/bin/python

une Fois que vous faites cela, au lieu de courir comme ceci:

$ python your_file.py

Vous pouvez l'exécuter comme ceci:

$ ./your_file.py

ou encore renommer yourfile et l'exécuter comme ceci:

$ ./yourfile

et si vous copiez alors yourfile pour le bac (c'est à dire #!/usr/bin/, ou #!/usr/local/bin/) vous pouvez l'exécuter comme ceci:

$ yourfile

alors vous pouvez...

Utiliser raw_input() pour solliciter et obtenir des commentaires de votre utilisateur.

your_file.py:

#!/usr/local/bin/python

import os

while(True):
    # cntrl-c to quit
    input = raw_input('your_prompt$ ')
    input = input.split()
    if input[0] == 'ls':
        dire = '.'
        if len(input) > 1:
            dire = input[1]
        print('\n'.join(os.listdir(dire)))
    else:
        print('error')

your_file.py utiliser l'exemple:

$ chmod 744 your_file.py 
$ cp your_file.py /usr/local/bin/your_file 
$ your_file 
your_prompt$ ls
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
your_prompt$ pwd
error
your_prompt$ ^CTraceback (most recent call last):
  File "/usr/local/bin/your_file", line 7, in <module>
    input = raw_input('your_prompt$ ')
KeyboardInterrupt
$

Saisir les arguments sys.argv à partir de la ligne de commande lorsque vous exécutez votre script:

list_argv.py:

#!/usr/local/bin/python

import sys

print(sys.argv)

list_argv.py utiliser l'exemple:

$ python list_argv.py 
['list_argv.py']
$ python list_argv.py hello
['list_argv.py', 'hello']
$ python list_argv.py hey yo
['list_argv.py', 'hey', 'yo']

$ chmod 744 list_argv.py 
$ ./list_argv.py 
['./list_argv.py']
$ ./list_argv.py hi
['./list_argv.py', 'hi']
$ ./list_argv.py hey yo
['./list_argv.py', 'hey', 'yo']

$ cp list_argv.py /usr/local/bin/list_argv
$ list_argv hey yo
['/usr/local/bin/list_argv', 'hey', 'yo']

Remplacer raw_input() avec sys.argv.

"your_ls.py':

#!/usr/local/bin/python

import sys
import os

dire = '.'
if len(sys.argv) > 1:
    dire = sys.argv[1]
print('\n'.join(os.listdir(dire)))

'your_ls.py' exemple d'utilisation:

$ chmod 744 your_ls.py 
$ cp your_ls.py /usr/local/bin/your_ls
$ your_ls 
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
$ your_ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py
$ your_ls blah
Traceback (most recent call last):
  File "/usr/local/bin/your_ls", line 9, in <module>
    print('\n'.join(os.listdir(dire)))
OSError: [Errno 2] No such file or directory: 'blah'

Utiliser subprocess.Popen pour accéder à tout ce que vous pouvez depuis la ligne de commande.

your_subprocess.py:

#!/usr/local/bin/python

import os
import subprocess

while(True):
    # cntrl-c to quit
    input = raw_input('your_prompt$ ')

    process = subprocess.Popen(input, shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)

    out, err = process.communicate()

    print(out)
    print(err)

your_subprocess.py utiliser l'exemple:

$ chmod 744 your_subprocess.py 
$ cp your_subprocess.py /usr/local/bin/your_subprocess
$ your_subprocess 
your_prompt$ ls
list_argv.py
your_file.py
your_ls.py
your_subprocess.py


your_prompt$ ls .
list_argv.py
your_file.py
your_ls.py
your_subprocess.py


your_prompt$ pwd
/Users/ox/_workspace/cmd_ln


your_prompt$ blah

/bin/sh: blah: command not found

your_prompt$ ^CTraceback (most recent call last):
  File "/usr/local/bin/your_subprocess", line 8, in <module>
    input = raw_input('your_prompt$ ')
KeyboardInterrupt
$

BREAK STUFF!

: - D

AMUSEZ-VOUS!

- ox

22
répondu ox. 2014-06-29 18:55:03
la source

Vous devriez jeter un oeil à l' cmd module.

voir le Python Cookbook pour des exemples de son utilisation.

8
répondu Noctis Skytower 2013-06-28 01:45:21
la source

la façon la plus simple de faire une application de console interactive serait:

while True:
    command = raw_input('command? ').strip()
    if command == 'say_hello':
        print('Hello')
    elif command == 'other_thing':
        print('Doing something else')
    elif command == 'quit':
        break
    else:
        print('Invalid Command.')

C'est la structure de base. Si vous voulez quelque chose de plus vim, vous aurez probablement besoin d'utiliser la bibliothèque curses.

3
répondu MJ Howard 2015-04-08 23:32:13
la source

si vous voulez créer un binaire autonome pour un système UNIX, utilisez freeze. Si vous en voulez un pour un système Windows, regardez py2exe. Pour contrôler les lieux de sortie sur votre écran, utilisez le curses module.

0
répondu Brien 2013-06-28 00:44:02
la source

Autres questions sur