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:
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 .
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
Vous devriez jeter un œil au module cmd .
Voir le Python Cookbook pour des exemples de son utilisation.
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.