在 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
就“放弃”。
这种替换可以出现在大多数魔法中,而不仅仅是 !
。
正在尝试确定 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
就“放弃”。
这种替换可以出现在大多数魔法中,而不仅仅是 !
。