2016-03-27 37 views
3

私はanacondaを持つシステムでpython 2.7.3を実行しています。私は最近、インターネット・アーカイブインストールPIPと私はコマンドラインからインストールプログラムを実行したとき、私は以下を参照してください。エラー:Python 2.7の下でos.unameという名前のモジュールがありません。

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

は私もPythonのアイドルコマンドラインの中からこれを試してみました。モジュールはうまくロードされますが、同じエラーが発生します。 https://docs.python.org/2/library/os.html#os.uname

私のインストール::それはここでは、PythonでOSの一部として文書化されているようどうやらos.uname()は、私のインストールから欠落してい

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

[ 'F_OK'、 'O_APPEND'、「O_BINARY '、' O_TEMPORARY '、' O_TEXT '、' O_TRUNC '、' O_WRONLY '、' O_REQUIRT '、' O_REQUIRT '、' O_REQUIRT ' 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' 'alt'、 'chdir'、 'chmod'、 'close'、 'closer'、 'curdir'、 'defpath'、 'devnull'、 ''、 '_pickle_stat_result'、 '_pickle_statvfs_result' execv '、' execvp '、' execvp '、' execv '、' execv '、' execv '、' execv '、' execv ' 「getse」、「get」、「getpid」、「isatty」、「kill」、「linesep」、「listdir」、 'path'、 'path'、 'pipe'、 'popen'、 'popen2'、 'popen3'、 ' 'popen4'、 'putenv'、 'read'、 'remove'、 'removedirs'、 'rename'、 'rename'、 'rmdir'、 'sep'、 'spawnl'、 'spawnle'、 'spawnv' 'spawn'、 'startfile'、 'stat'、 'stat_float_times'、 'stat_result'、 'statvfs_result'、 'strerror'、 'sys'、 'system'、 'tempnam'、 'times'、 'tmpfile'、 'tmpnam 'wait'、 'walk'、 'walk'、 'write']

他のすべてのpythonのように見えているとされています。どこで私は間違えましたか? unameがないpython.osのバージョンがありますか?私は窓のマシンです。それは問題ですか?ここで

は、モジュール(インターネット・アーカイブで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-をしなかった(以下の回答で述べたように)ように思えます互換性があります。彼らはオプションの 'self.headers [' User-Agent ']'をAPIに提供し、私が提供する任意の文字列で動作する必要があります。だから私はこれをハックすることができます。

答えて

4

はい、Windowsマシン上で実行すると問題になります。ここではos.unameはUNIX系システムでのみ使用できます。 DOCから :

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

これは、Windowsマシン用の注意書きがないinternetarchiveのpythonモジュールのバグですか? –

+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です。

関連する問題