L'exécution interactif en ligne de commande code de Jupyter portable
Il est une option intéressante dans Ipython Jupyter ordinateur Portable pour exécuter des instructions de ligne de commande directement à partir de l'ordinateur portable. Par exemple:
! mkdir ...
! python file.py
D'ailleurs - ce code peut être exécuté à l'aide de os
:
import os
os.system('cmd command')
mais comment puis-je exécuter des commandes shell interactif. Par exemple:
!conda install package
peut exiger l'avenir d'entrée ([Y]/N
) ou un emplacement de dossier, mais n'accepte pas davantage de commentaires.
Petite question: quel système d'exploitation êtes-vous demander? Pour cette question, je pense que c'est important. Apparemment, vous pouvez entrer dans le shell Bash si vous voulez, mais cela n'a pas beaucoup de différence si vous êtes sur Windows.
Je suppose que c'est pertinent pour le 3, mais je suis particulièrement intéressé par les système d'exploitation Mac OS.
Mac peut probablement avoir un shell bash. Je vais regarder demain.
Je suppose que c'est pertinent pour le 3, mais je suis particulièrement intéressé par les système d'exploitation Mac OS.
Mac peut probablement avoir un shell bash. Je vais regarder demain.
OriginalL'auteur Dimgold | 2017-06-17
Vous devez vous connecter pour publier un commentaire.
En supposant que vous vous posez des questions à propos de l'interactivité, il y a quelque chose que vous pouvez essayer.
Si vous jamais demandé comment Jupyter sait quand la sortie d'une cellule de fin: eh bien, apparemment, il ne sait pas, c'est juste décharges capturé chaque sortie dans le plus récent de la cellule active:
(volontairement plus courte que celle-bel exemple, comme c'est juste à côté de l'info. Alors que les 20 secondes d'attente est en cours d'exécution, vous avez le temps pour activer une autre cellule, peut-être via l'émission d'un
a=6
)Ceci peut être utilisé pour obtenir la sortie de certains de la console de code à l'écran, tout en contrôlant depuis le thread principal:
Alors vous pouvez isssue commandes, comme
et
Même
b'ls\nexit\n'
fonctionne, c'est pourquoioutLoop
est tellement longue (un simplewhile(proc.poll() is None)
-print(...)
boucle se terminer plus tôt que il a attrapé toutes les sorties.Ensuite, le tout peut être automatisé:
Cela fonctionne bien sur https://try.jupyter.org/, mais évidemment, je n'ai pas voulu essayer d'installer conda paquets, donc je ne sais pas ce qui se passe quand conda pose une question.
Une chance, c'est que le champ de saisie reste au fond de la cellule (testé avec
ls;sleep 10;ls
). Une mauvaise chose, c'est que le champ de saisie besoin d'une entrée supplémentaire à la fin de disparaître (et c'est déjà le "gentil", lorsqu'il était un simplewhile(...)
-write(bytearray(input()))
-flush()
3-liner, il a été de sortir avec une exception.Si quelqu'un veut l'essayer sur Windows, il fonctionne avec
'cmd'
, mais je vous suggère d'utiliser une codé en dur'windows-1252'
au lieu desys.stdin/out.encoding
: ils disent que l'UTF-8, mais un simpledir
commande déjà produit une sortie qui n'est pas de l'UTF-8, ni ASCII (l'espace insécable entre les 3 chiffres groupes de tailles est un 0xA0 caractère). Ou tout simplement supprimer ledecode
partie (et l'utilisation derunning=0xA in line
)OriginalL'auteur tevemadar
la
!command
syntaxe est une syntaxe alternative de la%system
de magie, de laquelle les documents peuvent être trouvés ici.Comme vous l'avez deviné, c'est en invoquant
os.system
et aussi loin queos.system
fonctionne il n'y a pas de moyen simple de savoir si le processus de vous aurez besoin d'une entrée de l'utilisateur. Ainsi, lors de l'utilisation de l'ordinateur portable ou un multi-processus frontend vous n'avez aucun moyen de fournir dynamiquement d'entrée de votre programme, vous êtes en cours d'exécution. (contrairement à un appel àinput
en Python nous peut ordonnée à l'origine).Comme vous l'avez explicitement montrer de l'intérêt dans l'installation de paquets à partir de l'ordinateur portable, je suggère la lecture de la suite de Jake Van Der Plas qui est un résumé d'une discussion récente sur le sujet, et d'expliquer certaines des complications de le faire. Bien sûr, vous pouvez aller avec
--yes
option de conda, mais il ne garantit pas que l'installation avec conda le sera toujours.Note également que
!command
est un IPython fonction, pas un Jupyter.OriginalL'auteur Matt
Je poste cela comme une réponse. Ce n'est pas une bonne réponse, mais la façon dont je voudrais traiter le problème est d'écrire un script bash pour être exécuté en arrière-plan. J'ai regardé dans le '!' opérateur et il ne semble pas avoir beaucoup de documentation. Je ne peux même pas le trouver dans le Jupyter source. Cet article:
[Safari livre sur Jupyter Prédécesseur et composant IPython][1]https://www.safaribooksonline.com/blog/2014/02/12/using-shell-commands-effectively-ipython/
suggère que c'est tout simplement la façon dont les choses étaient avant, et probablement pour toujours. Sauf si vous voulez pirater dans la Magie des Commandes de la partie de la Jupyter ordinateur Portable et de le réparer vous-même.
Cela dit, étant donné qu'avec un peu de bash de programmation (C'est simple et ciblée) vous pouvez faire ce que vous voulez faire, vous pourriez envisager de l'itinéraire. Surtout si vous avez besoin des résultats assez pour mettre réputation.
Si vous voulez regarder dans l'exécution de scripts bash contre avec une réponse attendue cette réponse, c'est ce que vous cherchez: Ont bash script de réponse interactive invite
OriginalL'auteur Dylan Brams
Bonne option pour la plupart des commandes que j'ai rencontré est l'aide de non-interactive args. E. g. dans le cas ci-dessus:
Si vous avez absolument besoin pour nourrir les invites, vous pouvez utiliser printf hack, par exemple:
Cette prise en charge de plusieurs entrées, vous en séparer par des '\n'
OriginalL'auteur Ivan