Existe-t-il un moyen d'accéder aux variables dans le noyau python noyau depuis un %%bash
ou autre %%script
cellule?
Peut-être comme arguments de ligne de commande ou variables d'environnement?
Les variables Python sont accessibles dans la première ligne d'une cellule %%bash
Ou %%script
Et peuvent donc être transmises en tant que paramètres de ligne de commande au script. Par exemple, avec bash, vous pouvez faire ceci:
%%bash -s "$myPythonVar" "$myOtherVar"
echo "This bash script knows about $1 and $2"
L'option de ligne de commande -s
Vous permet de passer des paramètres positionnels à bash, accessible via $n
Pour le nième paramètre positionnel. Notez que ce qui est réellement affecté à la variable positionnelle bash est le résultat de str(myPythonVariable)
. Si vous passez des chaînes contenant des guillemets (ou d'autres caractères sensibles à bash), vous devrez les échapper avec une barre oblique inverse (par exemple: \"
).
Les guillemets sont importants - sans eux, les variables python (représentations de chaînes) sont divisées en espaces, donc si myPythonVar
était un datetime.datetime
Avec str(myPythonVar)
comme "2013-10-30 05:04:09.797507"
, le script bash ci-dessus recevrait 3 variables positionnelles, les deux premières avec les valeurs 2013-10-30
et 05:04:09.797507
. Sa sortie serait:
This bash script knows about 2013-10-30 and 05:04:09.797507
Si vous souhaitez nommer les variables et que vous exécutez Linux, voici une approche:
%%script env my_bash_variable="$myPythonVariable" bash
echo myPythonVariable\'s value is $my_bash_variable
Vous pouvez spécifier plusieurs affectations de variables. Méfiez-vous encore des citations et autres choses (ici bash se plaindra amèrement!). Pour comprendre pourquoi cela fonctionne, consultez la page de manuel env
.
Pour inclure les variables python dans les commandes bash exécutées à l'aide de la syntaxe !<some command>
vous pouvez utiliser {<variable>}
comme suit:
In [1]: for i in range(3):
...: !echo {i+1}
...:
1
2
3
Bien que cela soit légèrement différent de ce que l'OP a demandé, il est étroitement lié et utile pour effectuer une tâche de script. Cet article propose d'autres astuces et exemples d'utilisation de la commande Shell dans les blocs-notes IPython et Jupyter.
Un problème est que si la variable que vous souhaitez donner à votre bash est une liste, elle ne fonctionne pas comme prévu.
Par exemple, dans une cellule python:
l = ['A', 'B', 'C']
alors si vous le donnez directement à l'option magique, la cellule suivante:
%%bash -s "$l"
for i in $1
do
echo $i
done
Il sera étrangement divisé comme ceci:
['A',
'B',
'C']
La réponse la plus simple est de mettre du code entre accolades {}
pour transformer votre liste python en liste bash, comme suit:
%%bash -s "{" ".join(l)}"
for i in $1
do
echo $i
done
Ce qui donne la sortie attendue:
A
B
C
Juste pour noter une variation, si vous devez passer autre chose qu'une simple variable au script bash:
%%bash -s $dict['key1'] $dict['key2'] $dict['key3']
va horriblement mal, mais
%%bash -s {dict['key1']} {dict['key2']} {dict['key3']}
fonctionne bien.
Non, %%script
la magie est générée automatiquement et n'effectue aucune communication de données interprocessus magique. (ce qui n'est pas le cas pour %%R
mais qui est une magie distincte dans sa propre classe avec un soin supplémentaire de la part de R
peuples)
Mais écrire votre propre magie qui le fait n'est pas trop difficile à faire.