Exemple: sortie: p>
4 Réponses :
Vous devez exporter la fonction Shell, il sera donc hérité des coquilles d'enfants.
#!/bin/bash function my_test(){ echo this is a test $1 } my_test 1 export -f my_test python -c "from subprocess import check_output; print(check_output('my_test 2', shell=True))"
Merci, cela fonctionne, mais je me demandais s'il y avait un moyen de le hériter de Python sans toucher le script shell. Je suppose que cela n'est pas possible, non?
Pouvez-vous mettre la fonction dans un autre script? Ensuite, vous pouvez utiliser script SCRIPTNAME code> avant d'essayer d'appeler la fonction.
Python ne sait rien sur les scripts ou les fonctions shell. Il dit simplement à la coquille d'exécuter la commande. Si la fonction n'est pas dans l'environnement de la coque, elle ne peut pas l'exécuter. Vous devez donc faire quelque chose pour l'obtenir dans l'environnement.
Ouais, je me demandais s'il est possible d'obtenir une fonction de la coquille mère sans la coque mère l'exportant.
Non, ce n'est pas possible.
C'est le point d'exportation, c'est la voie à une fonction d'être héritée.
Si vous exécutez le script avec, par exemple, bash -a my_script code>, le shell marque tous les noms et fonctions d'exportation sans avoir à modifier le script lui-même.
Cela ne fonctionne pas pour moi. Erreur de syntaxe: "(" inattendu code> car
/ bin / sh: lien symbolique vers le tableau de bord code> donc j'ai changé en
bash code>. Maintenant, je reçois
. Commande 'My_Test 2' Statut de sortie non nulle 127. Code> (Ubuntu 18.04, Bash 4.4.19, Python 2.7.17)
Il devrait être #! / Bin / bash code>
@jozxyqk je viens de le tester avec ce correctif. J'utilise Python 3.6.3. Cela n'a pas fonctionné avec Python 2.7, j'ai eu des erreurs du module de sous-processus, mais je ne vais pas vous inquiéter d'une version obsolète de Python.
Changer pour exécuter python3 code> (3.6.9) J'ai toujours la même erreur. Sur une autre machine où
python code> est par défaut à 3.8.5, il fonctionne effectivement (en fait
python2 code> au 2.7.18 y travaille également). Il y a peut-être un autre environnement de contexte qui cause des problèmes.
Quelle version de bash code>? J'ai testé sur un Mac en cours d'exécution 3.2.
Vous pouvez utiliser le module OS.
import os os.system("anything what you would like to do in the shell")
Je ne vois pas comment cela aide Python -C "Import OS; impression (OS.System (my_test 2 '))" Code> Sorties Sorties
SH: My_TEST: commande non trouvée code >
Le module OS est définitivement le moyen le plus simple et ne cause pas beaucoup de problèmes dans une coquille. P>
Exportation d'une fonction, qui n'est pas pris en charge par tous les coques, place le code dans le bloc Environnement em>. Il s'agit d'un bloc neutre de langage de texte Ceci était la base de shellshock . p> Le problème est que les deux langues Bash et Python sont totalement différentes, donc une fonction écrite dans une ne sera pas directement exécutable par l'autre sans traduction. Le processus d'enfant pourrait numériser le bloc d'environnement à la recherche de la fonction, puis traduisez et compilez-la dans sa propre langue. Beaucoup de travail, et pourrait facilement être un problème de sécurité. P> Si vous voulez juste aller bash-> python-> bash, puis exporter la fonction du premier script Bash devrait le faire, car il sera copié dans chaque bloc d'environnement. Cependant, vous indiquez également dans un commentaire que vous ne voulez pas que le premier script l'exporte. p> Eh bien vous pourrait em> lire le code de fonction à l'aide de Python dans une chaîne de texte, puis mettez-le dans le bloc d'environnement vous-même (c'est ce que Le nom réel utilisé dépend de votre version de bash. La vulnérabilité de Shellshock a entraîné beaucoup de changements. Mieux créer une fonction de test, l'exporter, puis utiliser export code> La coquille). Utilisez le dictionnaire
os.environ code>. P>
env code> pour trouver son nom complet. Par exemple, sur ma version une fonction simple appelée
gash code> apparaît dans le bloc d'environnement comme
bash_func_gash %% code>. P>
#!/bin/bash
gash
Pourquoi ne pas enregistrer
my_test code> fonction dans un fichier shell distinct et exécuter
python -c code> avec cet appel de script shell d'un autre?
/ bin / sh code> ne prend pas en charge le mot clé code>. Utilisez
#! / Bin / bash code> (ou une autre coquille) pour votre shebang.
Puis-je vous demander pourquoi voudriez-vous appeler une fonction définie uniquement dans ce shell?