Puis-je accéder aux variables python à l'intérieur d'une cellule de bloc-notes ipython `%%bash` ou `%%script`?
y a-t-il un moyen d'accéder aux variables du noyau python actuel à partir d'un %%bash
ou %%script
cellule?
peut-être comme argument de ligne de commande ou variable(s) d'environnement?
5 réponses
les variables Python sont accessibles dans la première ligne d'un %%bash
ou %%script
cellule, et ainsi peut être passé comme 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 and "
-s
option de ligne de commande vous permet de passer des paramètres de position à bash, accédé par $n
pour le paramètre de position n-ème. Notez que ce qui est en fait assigné à la variable de position de bash est le résultat de str(myPythonVariable)
. Si tu passes des cordes contenant des caractères de citation( ou d'autres caractères bash-sensibles), vous aurez besoin de Les échapper avec un antislash (par exemple:\"
).
les guillemets sont importants - sans eux les variables python (représentations de chaîne) sont divisées sur les espaces, donc si myPythonVar
est un datetime.datetime
str(myPythonVar)
"2013-10-30 05:04:09.797507"
, le script bash ci-dessus recevrait 3 variables de position, les deux premières avec des valeurs 2013-10-30
et 05:04:09.797507
. C'est le résultat serait:
This bash script knows about 2013-10-30 and 05:04:09.797507
si vous voulez nommer le variables et vous utilisez linux, voici une approche:
%%script env my_bash_variable="$myPythonVariable" bash
echo myPythonVariable\'s value is $my_bash_variable
vous pouvez spécifier plusieurs assignations de variables. Encore une fois méfiez-vous des citations et d'autres choses semblables (ici bash se plaindra amèrement!). Analyser pourquoi cela fonctionne, voir le env
page de man.
pour inclure des variables python dans les commandes bash, exécutez en utilisant 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 ce soit légèrement différent de ce que l'OP demandait, il est étroitement lié et utile dans l'exécution d'une tâche de script. Ce post contient plus de bons conseils et d'exemples d'utilisation de commandes shell dans les notebooks D'IPython et de Jupyter.
juste pour noter une variation, si vous avez besoin de passer quelque chose d'autre qu'une simple variable au script de bash:
%%bash -s $dict['key1'] $dict['key2'] $dict['key3']
va très mal, mais
%%bash -s {dict['key1']} {dict['key2']} {dict['key3']}
fonctionne très bien.
Un problème est que, si la variable que vous souhaitez donner à votre bash est une liste, il ne fonctionne pas comme prévu.
par exemple, dans une cellule de python:
l = ['A', 'B', 'C']
puis si vous le donnez directement à l'option magique la cellule suivante:
%%bash -s "$l"
for i in
do
echo $i
done
Il sera curieusement split comme ceci:
['A',
'B',
'C']
la réponse la plus simple est de mettre le code dans des accolades {}
pour transformer votre liste python en bash list, comme le suivantes:
%%bash -s "{" ".join(l)}"
for i in
do
echo $i
done
qui donnent le résultat attendu:
A
B
C
Non, %%script
la magie est autogénérée et ne fait aucune communication de données magiques entre les processus. (ce qui n'est pas le cas pour %%R
mais qui est une magie séparée dans sa propre classe avec un soin supplémentaire de R
les gens)
mais écrire votre propre magie qui le fait n'est pas trop difficile à faire.