Определение переменных среды при использовании клеточной магии Юпитера - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы понять, как работает переменная область видимости в записных книжках Jupyter.

Когда я создаю записную книжку bash с двумя ячейками, экспортируемые переменные среды видны через границы ячейки:

В [1]:

export PATH=$PATH:~/samplepath

В [2]:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myuser/samplepath

Но если я создам Python записывает и использует магию ячеек для достижения того же результата, переменные больше не видны через границы ячеек:

В [1]:

%%script bash
export PATH=$PATH:~/samplepath

В [2]:

%%script bash
echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Это поведение остается одинаковым для разных магий (т. Е. Использование восклицательного знака перед эхо вместо сценария магия дает тот же результат),

Итак, я хотел бы понять, каковы правила области видимости в этом случае и как я могу export действительно экспортировать переменные, чтобы они были видны во всей записной книжке.

1 Ответ

0 голосов
/ 18 февраля 2019

В блокноте Jupyter (как во втором примере) , команды оболочки в блокноте выполняются во временной подоболочке, т.е. каждая команда, которую вы пишете с использованием ! (или ниже %%bash), выполняется вдругой подпроцесс.

Хорошее описание от этого сообщения в блоге :

Команды оболочки Jupyter Notebook выполняются в оболочке, которая является подпроцессомоболочка работает ноутбук.Из-за этого изменения переменных среды в дочерней (ячейке) оболочке не будут отражены в родительской (записной) оболочке.

В [1]:

%%bash 
export var="5"
echo $var
5

В [2]:

%%bash
echo $var

Нет вывода

Именно по этой причине такие команды, как !cd /path/, нельзя использовать для навигациифайловая система.Отметьте еще одну запись в блоге на эту тему.

Хотя дело обстоит иначе с bash notebook , где все выполняется в одной оболочке.

Решение:

Если вы хотите экспортировать переменную в переменные оболочки, вы можете использовать магическую функцию %env следующим образом:

In[3]:

%env var "5"

In [4]: ​​

%env var

In [5]:

%%bash
echo $var

Выход In [4] и In [5]:

'"5"'

Примечание: Но будьте осторожны, не делайте %env PATH=$PATH:~/samplepath, поскольку он просто заменит переменную PATH, что вызовет проблемы.Приведенное выше решение рекомендуется только для несистемных переменных.Тем не менее, вы можете отредактировать .bashrc для универсального изменения переменной PATH.

...