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?

38
demandé sur drevicko 2013-10-25 05:21:31

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.datetimestr(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.

50
répondu drevicko 2013-10-31 23:03:15

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.

23
répondu Steven C. Howell 2017-10-26 11:52:56

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.

2
répondu David Kaufman 2018-01-22 15:17:11

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
2
répondu mickours 2018-07-04 13:35:49

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.

0
répondu Matt 2016-07-11 21:14:07