from os import environb as environ
在Windows Anaconda
python 3.6
安装中输入上述命令时,我得到以下错误:
ImportError: cannot import name 'environb'
。在
这似乎是因为
environb is only available if supports_bytes_environ is True.
以及
supports_bytes_environ
在Windows上为False。在
有办法绕过这个问题吗?在
参考号:https://docs.python.org/3/library/os.html#os.environb
具体地说,我在GRASS GIS Python scripting library中发现了这个错误。在
首先:你可能根本不需要
os.environb
。在我将介绍在开发Python软件时为什么不这样做,并在最后介绍GRASS GIS以及如何正确地修复该项目。在
为什么你不需要这个东西
在非Windows系统上,只有当您需要从环境中访问原始二进制数据时,才需要使用
os.environb
映射,而不需要根据当前区域设置将其解码为Unicode。您可能希望拥有该访问权限,因为区域设置可能错误,或者您希望将二进制数据从环境变量传递到程序,而不必使用区域设置和surrogateescape
错误处理程序对其进行重新编码,或者以不同的编码方式将数据传递给另一个程序,同样不必首先强制创建surrogateescape
解码字符串。(我掩盖了这样一个事实:在POSIX中,您can't use nulls in environment variables但这与此无关)。在在Windows上,您不需要这样做,因为在那个操作系统上,环境变量已经作为Unicode数据传递给Python。在没有二进制编码的情况下,你就不能接受二进制编码的数据。
os.environb
在Windows上没有任何作用!在因此,如果您创建跨平台软件,您应该使用
os.environ
,并要求正确配置语言环境,而不必担心os.environb
。在用防御性代码代替
有时需要二进制环境数据访问吗?然后,下一个选项可以是用
ImportError
保护符对缺少的属性进行防御性编码,并接受它丢失的事实:满的操作系统环境替换
最后一个选择是,对于某些第三方希望
os.environb
仍然可用而您无法更改的情况,或者您有一个很难更新的大型代码库的情况,就是只为Windows创建os.environb
对象。在这并不难;只需根据需要对原始
^{pr2}$os.environ
中的数据进行编码,并在设置新的键或值时再次对其进行解码。POSIX的os.environ
对象已经做了相同的事情,除了在另一个方向上,因此我们可以重用相同的基础设施:这将创建相同类型的映射对象,该对象完全支持获取和设置环境变量,对该对象的更改将在
os.environ
中可见,反之亦然:草地地理信息系统
在你提到的评论中,你正在尝试让GRASS GIS工作。在Python2和Python3上,这个项目只是做了一个错误的选择,将一个环境变量设置为
bytes
,而且不仅对于Windows,而且对于所有需要寻址的平台都存在问题。在它们try to use ^{} as a replacement for ^{} ,然后使用朴素的引用方法从
sys.argv
生成值。同时,同一个模块使用os.environ
来满足所有其他环境变量的需要。在在他们使用的
lib/python/script/core.py
的顶部然后在该映射中存储一个变量(在
def parser():
函数定义中):b'"' + encode(arg) + b'"'
是一种简单的引用值的方法,以避免子shell出现问题,但它不能处理嵌入的引号。在这是一个字节值。
sys.argv
是python3上的Unicode字符串列表,python2上的bytestrings。这在任何一个Python版本上都遵循os.environ
数据类型,因此在任何一个Python版本上,数据都应该作为str
类型来处理。在为了引用shell解释中的值,Python有^{} function ,它碰巧在python2和python3上都是
pipes.quotes()
。在{traceback>可以完全避免导入错误^ 1您的计算机所在位置):
我将把这个报告给GRASS GIS项目,这样他们就可以在将来的版本中修复这个问题。在
在Windows上,
os
模块没有environb
属性,因此无法加载它。但是,您可以手动添加:首先,将
os
加载到全局命名空间中:将其重载到
^{pr2}$os
模块中。这将修改已加载的模块:现在,如果运行
from os import environb as environ
,python将看到os
已经导入,并且不会再次尝试加载它。在如果还需要能够设置环境变量,则可以使用以下方法提供双向映射:
相关问题 更多 >
编程相关推荐