为什么节点或python无法访问用读命令设置的数字变量?

为什么节点或python无法访问用读命令设置的数字变量?

观察:使用操作系统的“读取”实用程序设置的环境变量包含纯数字值,无法在 Python 的os.environ[]结构中或通过节点的process.env结构访问,但 bash 可以访问。

预期的行为是,所有环境变量都可以从应用程序平等访问,无论它们是如何创建的。

如果使用 bash using 语法设置相同的变量export N=12345,则可以访问。似乎使用 read 命令创建的变量与其他变量的创建方式不同,这会干扰 node/Python 解析这些变量的逻辑。

无法从 node/Python 访问的相同变量可以在 bash 命令行中轻松访问,如下面的 echo 语句所示。

read 命令根据键输入设置环境变量。这是一种将秘​​密输入变量的便捷方式,无需留下该秘密的 .bash_history 记录。

转载于:

  • OSX 10.14.6(“Mojave”)Python 2.7,Python 3.6,节点 10.16.3 Linux
  • 内核3.10 CentOS 64位,Python2.7.5

样本:

使用read并提示用户输入名为 L 的环境变量的值。

~ $ read L
12345
~ $ python2
Python 2.7.16 (default, Apr 12 2019, 15:32:40) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ["L"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python@2/2.7.16/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
KeyError: 'L'
>>> 
~ $ python3
Python 3.7.3 (default, Mar 27 2019, 09:23:15) 
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ["L"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
    raise KeyError(key) from None
KeyError: 'L'
~ $ echo $L
12345

有趣的是,如果通过读取命令以外的其他方式设置数字变量,则可以在 Python 和节点中访问它们。

>>> os.environ["HISTSIZE"]
'12345678'

答案1

在 shell 中,你不是在使用环境变量,而是在使用变量。shell 只是以复制它的初始环境,但它维护自己的变量命名空间。

Shell 变量只会被复制回环境如果他们有“出口”标志. 默认情况下不会导出全新变量 - 这并不重要如何它们生成后,您仍然需要使用命令export在它们上设置正确的标志:

$ read L
12345↵

$ export L

$ python -c 'import os; print("L is", os.environ["L"])'
L is 12345

请再次注意,这并非特定于read。如果你只是设置变量而不使用 ,则会看到相同的失败export

$ N=abcdef

$ python -c 'import os; print("N is", os.environ["N"])'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.7/os.py", line 678, in __getitem__
    raise KeyError(key) from None
KeyError: 'N'

在 bash 中,您可以用来declare -p VAR检查该变量当前是否被标记为导出到环境中(如果是的话,它将有该-x选项)。

$ declare -p L N
declare -x L="12345"       # the one that was exported in example 1
declare -- N="abcdef"      # the one that deliberately wasn't, in example 2

(输出与输入一样有效——例如如果你实际上跑步 declare -x,相当于export。)


其他说明:

  • 环境只能包含字符串值,但 shell 变量不仅限于此 - 例如,大多数 shell 都有数组/列表和字典。

  • Shell 中经常有一些变量导出。例如,$LINES 和 $COLUMNS 在 shell 本身中是动态的,但导出它们只会让程序看到静态值,而这造成问题。

相关内容