Comment puis-je exécuter mon programme python directement à partir du shell?

10

J'ai écrit un script. Lorsqu'il démarre, il ne s'arrête pas et il continue de recevoir des données d'Internet. Je peux l'appeler ainsi:

cd /User/Desktop/project/internetScanner/
python3 main.py start

Mais je voudrais l'appeler directement depuis le terminal comme celui-ci, dans la destination:

internetScanner start

Comment faire?

Ted Wong
la source
2
Je me demande si le titre pourrait être changé à ce sujet ..
user606723
@ user606723 N'hésitez pas à suggérer une modification pour la faire changer. Le premier titre "Comment laisser mon programme s'exécuter sur le shell?" n'était pas très bon.
slhck

Réponses:

27

Vous devriez probablement renommer votre fichier main.pyen internetScanner. Les extensions sur * nix sont purement optionnelles. Cela ne devrait pas avoir d'importance ici.

mv main.py internetScanner

Ensuite, ajoutez la ligne suivante à ce fichier, dès le début:

#!/usr/bin/env python3

Cela garantira que lorsque le shell exécute le fichier, il saura utiliser python3pour interpréter le contenu. Ceci est connu comme le Shebang . Maintenant, rendez le fichier exécutable:

chmod +x internetScanner

Vous pouvez maintenant exécuter votre programme à partir de /User/Desktop/project/internetScanner/:

./internetScanner start

Votre programme s'exécutera au premier plan et continuera de s'exécuter jusqu'à ce que vous appuyiez sur Ctrl- C. Si vous ne le souhaitez pas, vous pouvez également démarrer le programme en arrière-plan, en ajoutant une esperluette après la commande:

./internetScanner start &

Cela laissera votre programme s'exécuter, mais vous pourrez continuer à utiliser votre shell. C'est ce qu'on appelle le contrôle des travaux, et il y a un tutoriel simple à ce sujet ici .

Si vous voulez maintenant pouvoir exécuter le programme depuis n'importe où sur le système, vous devez ajouter le internetScannerrépertoire à votre PATH: Que sont les variables PATH et autres variables d'environnement, et comment puis-je les définir ou les utiliser?

slhck
la source
Bonne réponse. Je recommanderais d'ajouter qu'il pourrait vouloir terminer la commande avec une esperluette (&) s'il ne veut pas l'attendre et / ou rediriger sa sortie et son flux d'erreur vers un fichier.
Ben Hocking
@BenHocking Merci, je l'ai ajouté à la réponse.
slhck
X &ne détache pas le processus du shell de contrôle, il ne fait que créer un arrière-plan du processus, ce qui signifie que si ce shell se ferme, le signal TERM lui sera envoyé; donc si vous ne voulez pas que vous devez utiliser Détacher , detach ./internetScanner start.
Dan D.
1
@DanD. … Ou nohup, disownou at, et cetera. Comment détacher un processus de Terminal, entièrement?
slhck
Il convient de noter qu'il peut toujours être nommé main.pytant qu'il est lié à internetScannerquelque part dans $ PATH.
jdd
2

En supposant qu'aucun autre fichier /User/Desktop/project/internetScanner/ne soit nécessaire, si vous souhaitez installer pour un seul utilisateur, liez ( ln -s) main.pyà $HOME/bin/internetScanner. Vous devrez probablement mkdir en $HOME/binpremier.

La prochaine fois que vous vous connecterez, il $HOME/binsera probablement ajouté à votre CHEMIN. Si vous souhaitez qu'il soit disponible pour tous les utilisateurs, copiez-le dans /usr/local/bin.

S'il doit s'exécuter /User/Desktop/project/internetScanner/, commencez par importer oset appeler

os.chdir('/User/Desktop/project/internetScanner/') 

ou créez un script de lancement dans $HOME/binou /usr/local/binqui change /User/Desktop/project/internetScanner/et exécute le script.

Perkins
la source
0

Mettez le alias internetScanner "python /User/Desktop/project/internetScanner/main.py"fichier .aliases (pour csh). Pour bash, alias internetScanner="python /User/Desktop/project/internetScanner/main.py"entrez .bashrc. Après cela, vous pouvez utiliser internetScanner start de n'importe où.

Excalibur
la source
Je n'ai jamais entendu parler d'un .aliasesdossier. Est-ce quelque chose de standard pour Bash? ou devez-vous le trouver explicitement dans votre .bashrc?
Kazark