web-dev-qa-db-fra.com

Puis-je accéder aux variables python dans une cellule de bloc-notes ipython `%% bash` ou` %% script`?

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?

46
drevicko

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.

61
drevicko

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.

35
Steven C. Howell

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

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.

2
David Kaufman

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.

0
Matt