3

我在具有 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 ', ' file ', ' name ', ' package','_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'、'kill'、'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']'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']'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']'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']'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']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']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']pardir','path','pathsep','pipe','popen','popen2','popen3','popen4','putenv','read','remove','removedirs','rename' ,'重命名','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' , '走', '写']pardir','path','pathsep','pipe','popen','popen2','popen3','popen4','putenv','read','remove','removedirs','rename' ,'重命名','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' , '走', '写']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']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']'stat'、'stat_float_times'、'stat_result'、'statvfs_result'、'strerror'、'sys'、'system'、'tempnam'、'times'、'tmpfile'、'tmpnam'、'umask'、'unlink '、'unsetenv'、'urandom'、'utime'、'waitpid'、'walk'、'write']'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']',它应该可以与我提供的任何字符串一起使用。所以我可以破解这个。

4

2 回答 2

4

是的,在 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

于 2016-03-27T17:50:46.983 回答
2

这个答案有点事后,但我会推荐以下内容:

import platform
unameinfo = platform.uname()

这在 Windows 下运行良好,并且由于 uname 在文档https://docs.python.org/3/library/platform.html中的跨平台下列出,我希望也可以携带到其他平台。由于这个问题被标记为 python2.7 我应该提到它已经可用于 python2,但这些文档现在是 oldskool。

于 2017-10-19T13:55:45.773 回答