由于某种原因,我的系统设置了一个没有名称的环境变量。这可以在输出中看到,printenv
一行仅包含=
和 导致 Python 出现问题(更具体地说os.environ
是对象)。
如何取消设置此环境变量?是否还有其他解决方法(例如,首先阻止设置变量)?
要重现例如env -i printenv
,或者对于Python问题执行env -i = python -c "import os; os.environ.clear()"
答案1
环境变量不应具有空名称,因此许多实用程序不支持它们。
GNU coreutils 的命令env
支持使用空名称设置环境变量,但不支持取消设置。这是一个错误。
$ env '=wibble' env |grep wibble
=wibble
$ env '=wibble' env -u '' env
env: cannot unset `': Invalid argument
普通 shell 也无法取消设置空名称。没关系,因为空名称不应该用作环境变量,也不能用作 shell 变量。 Zsh 是其中唯一有缺陷的一个:它假装完成了这项工作,但实际上什么也没做。
$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: `': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset: is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble
正如你所注意到的,Python当它发现环境变量的空名称时出现错误。
Perl没有这样的问题,所以它可能是您的解决方案。请注意,您必须执行新的 shell 才能使用外部进程来更改环境。
perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"
答案2
你可以做:
import os
for k in os.environ.keys():
print repr(k)
del os.eniviron[k]
print os.environ
os.environ.clear()
我不确定为什么直接os.environ.clear()
抛出错误,我启动了上面的 for 循环代码,看看是否能找到导致问题的关键。请注意,您必须指定.keys()
,仅迭代 usingfor k in os.environ:
就会产生错误,因为您更改了正在迭代的键的字典(.keys()
创建副本)。