7
votes

Est-il possible d'utiliser des fonctions définies dans la coque de Python?

Exemple: xxx

sortie: xxx


3 commentaires

Pourquoi ne pas enregistrer my_test fonction dans un fichier shell distinct et exécuter python -c avec cet appel de script shell d'un autre?


/ bin / sh ne prend pas en charge le mot clé . Utilisez #! / Bin / bash (ou une autre coquille) pour votre shebang.


Puis-je vous demander pourquoi voudriez-vous appeler une fonction définie uniquement dans ce shell?


4 Réponses :


10
votes

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))"


12 commentaires

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 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 , 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 car / bin / sh: lien symbolique vers le tableau de bord donc j'ai changé en bash . Maintenant, je reçois . Commande 'My_Test 2' Statut de sortie non nulle 127. (Ubuntu 18.04, Bash 4.4.19, Python 2.7.17)


Il devrait être #! / Bin / bash


@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 (3.6.9) J'ai toujours la même erreur. Sur une autre machine où python est par défaut à 3.8.5, il fonctionne effectivement (en fait python2 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 ? J'ai testé sur un Mac en cours d'exécution 3.2.



-1
votes

Vous pouvez utiliser le module OS.

import os
os.system("anything what you would like to do in the shell")


1 commentaires

Je ne vois pas comment cela aide Python -C "Import OS; impression (OS.System (my_test 2 '))" Sorties Sorties SH: My_TEST: commande non trouvée



-3
votes

Le module OS est définitivement le moyen le plus simple et ne cause pas beaucoup de problèmes dans une coquille.


0 commentaires

2
votes

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 fort>, qui est copié de parent à l'enfant lorsqu'un nouveau processus est créé.

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 export code> La coquille). Utilisez le dictionnaire os.environ code>. P>

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 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


0 commentaires