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

Mixing shell variables and python variables in IPython '!command'

正在尝试确定 IPython(v7.12.0,在 Amazon SageMaker 上)上的这种行为是错误还是我遗漏了一些正确的方法/记录的约束...

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

NODE_VER = "v16.14.2"
NODE_DISTRO = "linux-x64"

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

!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

...但这不是:

!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**

我已经尝试了几个组合,例如使用 $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

How to reference both a python and environment variable in jupyter bash magic?

尝试

!echo /usr/local/lib/nodejs/node-{NODE_VER}-{NODE_DISTRO}/bin:$$PATH

$$PATH 强制它使用系统变量而不是试图找到一个 Python/local。

各种例子:

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

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

In [139]: !echo $abc

In [140]: !echo {foo} $abc
{foo}

它可能会把替换放在try/except块中,如果有任何NameError就“放弃”。

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