错误:python 2.7 下没有名为 os.uname 的模块
Posted
技术标签:
【中文标题】错误:python 2.7 下没有名为 os.uname 的模块【英文标题】:Error: No module named os.uname under python 2.7 【发布时间】:2016-07-15 00:24:14 【问题描述】:我在具有 anaconda 的系统上运行 python 2.7.3。我最近 pip 安装了 internetarchive,当我从命令行运行安装程序时,我看到:
AttributeError: 'module' object has no attribute 'uname'
我也在 python 的空闲命令行中尝试过这个。该模块加载正常,但我得到同样的错误。显然,我的安装中缺少 os.uname(),因为它在此处被记录为 python 中 os 的一部分:https://docs.python.org/2/library/os.html#os.uname
我的安装:
>>> import os
>>> dir(os)
['F_OK'、'O_APPEND'、'O_BINARY'、'O_CREAT'、'O_EXCL'、'O_NOINHERIT'、'O_RANDOM'、'O_RDONLY'、'O_RDWR'、'O_SEQUENTIAL'、'O_SHORT_LIVED'、'O_TEMPORARY ','O_TEXT','O_TRUNC','O_WRONLY','P_DETACH','P_NOWAIT','P_NOWAITO','P_OVERLAY','P_WAIT','R_OK','SEEK_CUR','SEEK_END','SEEK_SET', 'TMP_MAX'、'UserDict'、'W_OK'、'X_OK'、'_Environ'、'all'、'builtins'、'doc'、'文件'、'名称'、'包'、'_copy_reg'、'_execvpe'、'_exists'、'_exit ','_get_exports_list','_make_stat_result','_make_statvfs_result','_pickle_stat_result','_pickle_statvfs_result','中止','访问','altsep','chdir','chmod','close','closerange', 'curdir'、'defpath'、'devnull'、'dup'、'dup2'、'environ'、'errno'、'error'、'execl'、'execle'、'execlp'、'execlpe'、'execv ','execve','execvp','execvpe','extsep','fdopen','fstat','fsync','getcwd','getcwdu','getenv','getpid','isatty', '杀','linesep','listdir' ,'lseek','lstat','makedirs','mkdir','name','open','pardir','path','pathsep','pipe','popen','popen2',' popen3','popen4','putenv','read','remove','removedirs','rename','renames','rmdir','sep','spawnl','spawnle','spawnv' ,'spawnve','startfile','stat','stat_float_times','stat_result','statvfs_result','strerror','sys','system','tempnam','times','tmpfile',' tmpnam'、'umask'、'unlink'、'unsetenv'、'urandom'、'utime'、'waitpid'、'walk'、'write']
python 中的其他一切似乎都很好,并且一直如此。我哪里做错了?是否有缺少 uname 的 python.os 版本?我在 Windows 机器上;这是个问题吗?
这是模块中的相关代码(internetarchive 中的 session.py):
def _get_user_agent_string(self):
"""Generate a User-Agent string to be sent with every request."""
uname = os.uname()
try:
lang = locale.getlocale()[0][:2]
except:
lang = ''
py_version = '0.1.2'.format(*sys.version_info)
return 'internetarchive/0 (1 2; N; 3; 4) Python/5'.format(
__version__, uname[0], uname[-1], lang, self.access_key, py_version)
... <elsewhere> ...
self.headers['User-Agent'] = self._get_user_agent_string()
所以看起来(如下面的答案中提到的)编码器很懒惰并且没有使这个 Windows 兼容。他们为 API 提供了一个可选的 'self.headers['User-Agent']',它应该可以与我提供的任何字符串一起使用。所以我可以破解这个。
【问题讨论】:
【参考方案1】:是的,在 Windows 机器上是个问题(在这里):os.uname 仅在类 unix 系统上可用。 来自文档:
os.uname()
返回一个 5 元组,其中包含标识当前操作系统的信息。元组包含 5 个字符串:(sysname、nodename、release、version、machine)。一些系统将节点名截断为 8 个字符或前导部分;获取主机名的更好方法是 socket.gethostname() 甚至是 socket.gethostbyaddr(socket.gethostname())。
可用性:最新的 Unix 风格。
如文档所说:
获取主机名的更好方法是 socket.gethostname() 甚至是 socket.gethostbyaddr(socket.gethostname())
获取有关系统的一些信息的可移植方式是sys.platform
和platform
package。
【讨论】:
那么这是 internetarchive python 模块中的一个错误,它对 windows 机器没有警告吗? 它不在 windows 下,因为 windows 没有uname
命令。 Unix 系统提供了这个命令,允许 Python 调用它并得到它的结果。【参考方案2】:
这个答案有点事后,但我建议如下:
import platform
unameinfo = platform.uname()
这在 Windows 下可以正常工作,并且由于 uname 在文档https://docs.python.org/3/library/platform.html 中的跨平台下列出,我希望也可以携带到其他平台。由于这个问题被标记为 python2.7,我应该提到它已经可用于 python2,但这些文档现在是 oldskool。
【讨论】:
以上是关于错误:python 2.7 下没有名为 os.uname 的模块的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pmw 时出现“ImportError:没有名为 tkinter 的模块”
Python 2.7 easy_install - 该进程无法访问该文件,因为它正在被另一个进程错误使用
适用于 Python 2.7 (Ubuntu) 的 MySQLdb