6 votes

Éviter que le processus du terminal ne se ferme, après que BBEdit ait exécuté un script.

J'utilise BBEdit pour écrire et tester des scripts en Python, et j'exécute habituellement les scripts dans un processus terminal, avec la commande "Run in Terminal". Y a-t-il un moyen de faire en sorte que le processus terminal ouvert par BBEdit reste "actif", après que le scripts soit terminé ? J'aimerais ne pas avoir le

[Process completed] 

et à la place d'avoir toujours une invite active, soit le shell ou l'environnement Python, avec toutes les variables que j'ai créées dans le script toujours existantes. Cela serait similaire à la situation lorsque je lance le script à partir d'un processus terminal existant, soit à partir du shell :

$ python script_name.py

ou à partir de l'interpréteur Python :

>>> script_name.py

En particulier, dans le dernier cas, lorsque le script sort, j'ai toujours le processus actif dans la fenêtre du terminal.

5voto

CousinCocaine Points 9430

Si je comprends bien, vous avez un script Python dans BBEdit.

Python script

Vous choisissez de tester le code en utilisant l'option "Run in Terminal" du menu "# !".

Run in Terminal

Maintenant une fenêtre de Terminal s'ouvre, exécute le script et sort.

exit code

Voici maintenant le coupable. BBEdit ne se contente pas d'exécuter votre script, mais ajoute également une balise exit . Il n'y a pas d'option dans BBEdit pour supprimer cet élément. exit commande. Mais BBEdit est hautement scriptable et il existe des solutions de contournement. Vous pouvez créer un script de BBEdit (à partir du menu script) qui s'exécute, mais personnellement je pense que la création de Service est la plus simple (exécuter un AppleScript qui ouvre votre script dans le Terminal comme vous l'auriez fait manuellement).

Dans ce traitement, vous avez fourni un script qui fait réellement ce que vous voulez.

3voto

Fabio Points 395

En s'appuyant sur la réponse de CousinCocaine et sur cette réponse à une vieille question que j'ai moi-même postée sur le forum BBEdit, je suis arrivé à cet AppleScript, qui est spécifique pour Python :

-------------------------------------------------------------------------------------------
# Auth: Christopher Stone
# modif Fabio Grazioso
# dCre: 2015/09/22 11:00
# dMod: 2017/10/03 18:40 
# Appl: BBEdit, Terminal
# Task: Attempt to run the front text document in Terminal.app.
# Libs: None
# Osax: None
# Tags: @Applescript, @Script, @BBEdit, @Run, @Front, @Document, @Terminal, @Python
-------------------------------------------------------------------------------------------

tell application "BBEdit"
    tell front text document
        if on disk = false then error "Front document is not saved!"
        if modified = true then save
        if contents of line 1 does not start with "#!" then error "No valid shebang line found!"
        set docName to its name
        set docFile to POSIX path of (get its file)
    end tell
end tell

set shCMD to text 2 thru -1 of "
FILE=" & docFile & ";
if [[ ! -x \"$FILE\" ]]; then
  chmod +x \"$FILE\";
fi
"
do shell script shCMD

set {oldTIDS, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "/"}
set docName to quoted form of docName
set docParentPath to quoted form of ((text items 1 thru -2 of docFile) as text)
set AppleScript's text item delimiters to oldTIDS

tell application "Terminal"
    activate
    if name of windows = {missing value} then do script
    if processes of front window = {} then do script

    tell front window
        if its busy = true then
            do script "cd " & docParentPath & " && python -i " & docName
        else
            do script "cd " & docParentPath & " && python -i " & docName in selected tab
        end if
    end tell
end tell

-------------------------------------------------------------------------------------------

Je trouve cette réponse meilleure que celle proposée par CousinCocaine simplement parce que je peux créer un raccourci clavier vers le script (AFAIK il n'est pas possible d'associer un raccourci à un service).

Les étapes à suivre pour que cela fonctionne sont les suivantes :

  1. Copiez le code script dans le script Editor.app (trouvé dans le dossier /Applications/Utilities/)
  2. Compilez le script (icône en forme de marteau sur la barre de l'éditeur).
  3. Enregistrez-le dans le dossier BBEdit scripts : /Users//Library/Application\ Support/BBEdit/scripts/
  4. En option Dans BBEdit, associez le script à un raccourci clavier, dans les Préférences -> Menus & Raccourcis -> script (vous devez cliquer à droite du nom du script, là où il est écrit "none", et appuyer sur votre raccourci).

Here is a screenshot of the preferences' pane

  1. Enfin, vous créez un script dans BBEdit, par exemple un script Python, vous le sauvegardez, et alors qu'il est la fenêtre avant dans BBEdit, vous sélectionnez l'AppleScript dans le menu script de BBEdit. Ceci enverra le script Python au Terminal et le script sera exécuté.

À propos de l'AppleSript, remarquez que l'option "-i" dans l'appel Python à la ligne

do script "cd " & docParentPath & " && python -i " & docName

fait en sorte qu'après l'exécution du script Python, l'interpréteur Python ne soit pas quitté, comme demandé dans la question.

Si les lignes

do script "cd " & docParentPath & " && python -i " & docName
do script "cd " & docParentPath & " && python -i " & docName in selected tab

sont remplacées par les lignes

do script "cd " & docParentPath & " && ./" & docName
do script "cd " & docParentPath & " && ./" & docName in selected tab

alors cet AppleScript peut lancer n'importe quel script, à condition que la bonne ligne "shebang" soit présente dans le script, comme toute première ligne. Pour un script Python, la ligne shebang devrait être :

#!/usr/bin/env python

alors que pour un shell bash script la ligne shebang devrait être :

#!/bin/bash

2voto

bated Points 143
$ python script_name.py &

Cela permettra d'exécuter le processus en arrière-plan.

Vous pouvez également essayer les réponses aquí dont je ne m'attribue pas le mérite

2voto

Mose Points 687

Ce n'est pas tout à fait ce que vous voulez, mais c'est une solution de rechange raisonnable :

FSWatch. En bref, il surveille un répertoire ou un fichier pour les changements, et exécute un script chaque fois qu'il voit un changement.

Ainsi, au lieu de s'exécuter dans un terminal, vous avez une fenêtre de terminal ouverte avec fswatch qui surveille les changements dans le(s) fichier(s). Lorsqu'il en voit un, il exécute le script -- dans ce cas le fichier à surveiller.

Cette méthode présente l'avantage de s'exécuter dans la même fenêtre à chaque fois, ce qui vous évite de faire apparaître de nouvelles fenêtres de terminal en permanence.

Itinéraire ici :

https://stackoverflow.com/questions/24573584/how-to-watch-file-changes-on-mac-osx-using-fswatch

0voto

Scott Earle Points 3966

Dans les préférences du terminal, sous Profils, sélectionnez le profil que vous utilisez par défaut, puis allez dans l'onglet Shell. Sous "Lorsque le shell se termine", sélectionnez "Fermer si le shell s'est terminé proprement".

Cela devrait faire en sorte que la fenêtre/l'onglet se ferme lorsque le script que vous exécutez se termine proprement.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X