Python subprocess.call un alias bash
Au travail, il y a un script qui liste les tâches terminées. Ceci a été écrit par quelqu'un d'autre et qui est hébergé sur le réseau. J'ai un alias dans mon .bashrc qui appelle ce script, avec ses nombreux drapeaux et autres, et je voulais écrire un script python pour appeler cet alias de quelques minutes pour que je puisse avoir une coque open avec des statistiques à jour. Cependant, subprocess.call("myAlias")
échoue. Je suis encore assez nouveau pour python, et je suis mal à comprendre cela.
from subprocess import call
def callAlias():
call("myAlias")
callAlias()
J'ai l'intention d'ajouter plus trop ça, mais j'ai touché le hic, sur ma première étape. 😛
Je ne posterais plus, mais il y a beaucoup de sensibles confidentiel de choses que j'ai à être prudent avec. Désolé pour le flou, le code, et l'absence de sortie d'erreur.
source d'informationauteur jtsmith1287
Vous devez vous connecter pour publier un commentaire.
Si l'alias que vous avez besoin est défini dans ~/.bashrc, alors il ne sera pas courir pour quelques raisons:
1) Vous devez donner le 'shell' mot-clé arg:
Sinon, votre commande est utilisée pour rechercher un fichier exécutable, plutôt que de passé à un shell, et c'est la coquille qui s'étend des choses comme les alias et les fonctions.
2) Par défaut, les sous-processus.appel et ses amis utilisent le '/bin/sh " coquille. Si c'est un Bash alias que vous voulez appeler, vous aurez besoin d'indiquer sous-processus à utiliser bash au lieu de sh, à l'aide de la "exécutable" mot-clé arg:
3) Toutefois, /bin/bash ne sera pas source ~/.bashrc, à moins que commencé comme un "interactive" shell (avec '-i'.) Malheureusement, vous ne pouvez pas passer exécutable='/bin/bash -je", car il pense que l'ensemble de la valeur est le nom d'un fichier exécutable. Donc, si votre alias est défini dans le mode normal de démarrage interactif, par exemple .bashrc, alors vous allez avoir à invoquer la commande à l'aide de cette forme alternative:
Vous devez définir la
shell
mot-clé:De la la documentation pertinente:
Les alias sont une fonction de coque (par exemple, ils sont définis et interprétés par le shell).
Cependant, le shell (/bin/sh) est exécutée de manière non interactive, donc pas de
.profile
ou.bashrc
fichiers sont lus et votre alias est probablement ne va pas être disponibles.Si vous êtes réticents à utiliser la totalité de la commande étendue dans votre script python, vous aurez à utiliser la
$ENV
variable d'environnement pour faire la coquille de lire le fichier avec l'alias défini dans il de toute façon:J'ai modifié Jonathan raison n ° 2 légèrement pour faire ce travail. Faire un
/usr/local/bin/interactive_bash
fichier qui contientet
chmod +x
. Puis, à partir de Python, vous pouvez appelerLa solution recommandée est de ne pas utilisation un alias de définir les fonctionnalités qui n'est pas exclusivement pour l'utilisation interactive (et même alors, shell fonctions sont supérieures à un certain nombre de voies).
Refactoriser l'alias dans un script autonome et de l'appeler comme toute autre commande externe.
Plus en détail, si vous avez
vous pouvez l'améliorer afin de ne pas polluer votre espace de noms global en la transformant en une fonction
ou tout simplement l'enregistrer comme
/usr/local/bin/myalias
etchmod a+x /usr/local/bin/myalias
pour le rendre exécutable pour tout le monde;(Ce qui s'exécute dans un processus secondaire, de sorte
x
aura disparu lorsque le script termine; nous n'avons donc pas besoin d'en fairelocal
.)(Bien sûr, si
frobnicate
est à la compétence écrite, peut-être vous pouvez simplifier à justefrobnicate foo bar baz
.)C'est une commune de la FAQ.