web-dev-qa-db-fra.com

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 écrit quelques scripts simples. Après avoir utilisé VIM comme Python IDE Je suis vraiment tombé amoureux des "programmes Terminal" (existe-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 de l'imprimer à l'écran. Cependant, cela revient à exécuter un script .py et une fois ce script terminé, le retour bash normal. Je voudrais créer un programme que je peux exécuter à 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 tapez le nom de mon programme -> le programme s'ouvrirait -> Ensuite, je voudrais utiliser des commandes comme: findomething. Avoir fondamentalement une réelle interaction avec mon programme.

De conclure:

  • Comment pourrais-je créer un tel programme?
  • Quels types de modules, livres ou sites recommanderiez-vous
24
Niels

Un vrai programme en ligne de commande est quelque chose dans la veine de ls ou grep; il est démarré à partir de la ligne de commande, mais il n'est pas interactif et peut être utilisé dans des pipelines et combiné avec d'autres programmes. Un programme en ligne de commande typique n'a pas d'expérience utilisateur interactive, mais s'appuie à la place sur l'historique de Shell et sur le fichier init pour la personnalisation.

Ce que vous voulez créer est une application curses , qui utilise toutes les capacités du TTY comme plate-forme interactive, pour le meilleur ou pour le pire. Pour ce faire, recherchez curses .

18
user4815162342

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

$ chmod 0744 your_file.py

-rwxr--r--   your_file.py

et ajoutez le chemin d'accès à python comme première ligne de your_file.py:

#!/usr/bin/python

ou (dans mon cas):

#!/usr/local/bin/python

Une fois que vous avez fait cela, au lieu de l'exécuter comme ceci:

$ python your_file.py

Vous pouvez l'exécuter comme ceci:

$ ./your_file.py

ou même le renommer en yourfile et l'exécuter comme ceci:

$ ./yourfile

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

$ yourfile

Ensuite vous pouvez...

Utilisez 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 Exemple d'utilisation:

$ 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
$

Saisissez des arguments avec sys.argv Dans 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 Exemple d'utilisation:

$ 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']

Remplacez raw_input() par 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)))

Exemple d'utilisation de 'your_ls.py':

$ 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'

Utilisez subprocess.Popen Pour accéder à tout ce que vous pouvez à partir de 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 Exemple d'utilisation:

$ 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
$

CASSER DES CHOSES!

:-RÉ

S'AMUSER!

-bœuf

23
ox.

Vous devriez jeter un œil au module cmd .

Voir le Python Cookbook pour des exemples de son utilisation.

9
Noctis Skytower

La façon la plus simple de faire une application 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.')

Voilà la structure de base. Si vous voulez quelque chose de plus semblable à vim, vous devrez probablement utiliser la bibliothèque curses.

3
MJ Howard

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

0
Brien