在 IPython '!command' 中混合 shell 变量和 python 变量

din*_*gus 2 ipython jupyter-notebook jupyter-lab amazon-sagemaker

试图弄清楚 IPython(v7.12.0,在 Amazon SageMaker 上)上的这种行为是否是一个错误,或者我缺少一些正确的方法/记录的约束...

假设我有一些 Python 变量,例如:

NODE_VER = "v16.14.2"
NODE_DISTRO = "linux-x64"
Run Code Online (Sandbox Code Playgroud)

这些命令在笔记本中都可以正常工作:

!echo $PATH
# Shows **contents of system path**
!echo /usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:
# Shows /usr/local/lib/nodejs/node-v16.14.2-linux-x64/bin
Run Code Online (Sandbox Code Playgroud)

...但这并不:

!echo /usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:$PATH
# Shows:
# /usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:**contents of system path**
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种组合,例如使用$NODE_VER语法代替(它生成node--/代替node-{NODE_VER}-{NODE_DISTRO}/,但似乎使用shell变量(PATH)和Python变量(NODE_VER/NODE_DISTRO)的任何组合都会失败。

谁能帮助我理解为什么以及如何解决它?

正如您可能已经猜到的那样,我的最终目标是实际将此文件夹添加到 PATH 而不是仅仅回显它 - 类似于:

!export PATH=/usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 5

如何在 jupyter bash magic 中引用 python 和环境变量?

尝试

!echo /usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:$$PATH
Run Code Online (Sandbox Code Playgroud)

$$PATH强制它使用系统变量,而不是尝试查找 Python/本地变量。

各种例子:

In [130]: foo = 'foo*.txt'
In [131]: HOME = 'myvar'
In [132]: !echo $foo
foo1.txt foobar0.txt foobar2.txt foobar3.txt foo.txt
In [133]: !echo $foo $HOME
foo1.txt foobar0.txt foobar2.txt foobar3.txt foo.txt myvar
In [134]: !echo $foo $$HOME
foo1.txt foobar0.txt foobar2.txt foobar3.txt foo.txt /home/paul
In [135]: !echo $foo $PWD
/home/paul/mypy
In [136]: !echo $foo $$PWD
foo1.txt foobar0.txt foobar2.txt foobar3.txt foo.txt /home/paul/mypy
In [137]: !echo {foo} $PWD
{foo} /home/paul/mypy
In [138]: !echo {foo} $$PWD
foo1.txt foobar0.txt foobar2.txt foobar3.txt foo.txt /home/paul/mypy
Run Code Online (Sandbox Code Playgroud)

任何未本地定义的变量都会强制您看到的行为:

In [139]: !echo $abc

In [140]: !echo {foo} $abc
{foo}
Run Code Online (Sandbox Code Playgroud)

它可能会将替换放在一个try/except块中,如果有的话“放弃” NameError

这种替换可以发生在大多数魔法中,而不仅仅是!