2016-03-27 7 views
3

Я запускаю python 2.7.3 в системе с анакондой. Я недавно ГПГ, установлен и когда Архив Интернета я запустить программу установки из командной строки Я вижу:Ошибка: нет модуля с именем os.uname под python 2.7

AttributeError: 'module' object has no attribute 'uname' 

Я также попытался это внутри простоя командной строки питона. Модуль загружается нормально, но я получаю ту же ошибку. По-видимому os.uname() отсутствует моей установки, так как она описана как часть зева в питон здесь: https://docs.python.org/2/library/os.html#os.uname

Моя установка:

>>> import os 
>>> dir(os) 

[ 'F_OK', 'O_APPEND', «O_BINARY 'O_CREAT', 'O_EXIT', '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 ',' все ',' встроенные ',' документ», 'файл', 'имя', 'пакет', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result' , '_pickle_stat_result', '_pickle_statvfs_result', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'curdir', 'defpath', 'devnull', ' dupl ',' dup2 ',' environ ',' errno ',' error ',' execl ',' execle ',' execlp ',' execlpe ',' execv ',' execve ',' execvp ',' execvpe ' , 'extsep', 'fdopen', 'fstat', 'fsync', 'getcwd', 'getcwdu', 'getenv', 'getpid', 'isatty', 'kill', 'lineep', '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', ' «sppveve», «startfile», «stat», «stat_float_times», «stat_result», «statvfs_result», «strerror», «sys», «system», «tempnam», «times», «tmpfile», «tmpnam» ',' unlink ',' unsetenv ',' urandom ',' utime ',' waitpid ',' walk ',' write ']

Все остальное в python кажется прекрасным и было. Где я неправ? Есть ли версия python.os, которой не хватает uname? Я на машинке для окон; это проблема?

Вот соответствующий код в модуле (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 API «self.headers» [User-Agent], и он должен работать с любой строкой, которую я предоставляю. Поэтому я могу взломать это.

ответ

4

Да, быть на машине с Windows является проблемой (здесь): os.uname доступен только в unix-подобных системах. Из дока:

os.uname()

Return a 5-tuple containing information identifying the current operating system. The tuple contains 5 strings: (sysname, nodename, release, version, machine). Some systems truncate the nodename to 8 characters or to the leading component; a better way to get the hostname is socket.gethostname() or even socket.gethostbyaddr(socket.gethostname()).

Availability: recent flavors of Unix.

Как сказано документ:

a better way to get the hostname is socket.gethostname() or even socket.gethostbyaddr(socket.gethostname())

портативный способ получить некоторую информацию о системе sys.platform и platformpackage.

+0

Так это ошибка в модуле python internetarchive, который не имеет оговорок для оконных машин? –

+0

Его не под окнами, потому что в окнах нет команды 'uname'. Unix-системы предоставляют эту команду, позволяя Python вызывать ее и получать ее результат. – aluriak

1

Этот ответ немного постфактум, однако я бы рекомендовал следующее:

import platform 
unameinfo = platform.uname() 

Это прекрасно работает под Windows, а так uname находится в списке кроссплатформенная в документации https://docs.python.org/3/library/platform.html я бы ожидать, чтобы нести на другие платформы также. Поскольку этот вопрос был помечен python2.7, я должен упомянуть, что он уже доступен для python2, но эти документы теперь oldskool.