2016-10-21 10 views
4

私は2つの異なるソフトウェア環境(環境A環境B)を持っており、私は両方の環境でPyJWTを実行しようとしています。 1つの環境で完全に正常に動作しています環境Aただし、失敗するのは環境Bです。PyJWTのバージョンを調べる方法は?

私はalgorithm == ESjwt.encode()を呼び出すとき、私は環境Bに取得していますエラーがある:Algorithm not supported

私はそれがなぜ働くのか理解しようとしています環境Aではなく、環境Bです。 2つの環境に異なるバージョンのPyJWTがインストールされているようです。しかし、どのバージョンのPyJWTが環境Bにインストールされているのか判断するのは難しいです。私はどうすればいいのですか?

import jwt, cryptography, sys, pkg_resources 

my_private_key = """XXXXX""" 
my_public_key = """YYYYYY""" 
original = {"Hello": "World"} 
print "sys.version = {}".format(str(sys.version)) 

try: 
    print "dir(jwt) = {}".format(str(dir(jwt))) 
except Exception as e: 
    print "Failed to get dir of jwt module: {}".format(e) 

try: 
    print "dir(cryptography) = {}".format(str(dir(cryptography))) 
except Exception as e: 
    print "Failed to get dir of cryptography module: {}".format(e) 

try: 
    print "jwt = {}".format(str(jwt.__version__)) 
except Exception as e: 
    print "Failed to get version of jwt module using .__version: {}".format(e) 
try: 
    print "cryptography = {}".format(str(cryptography.__version__)) 
except Exception as e: 
    print "Failed to get version of cryptography module using .__version: {}".format(e) 

try: 
    print "pkg_resources.require('jwt')[0].version = {}".format(str(pkg_resources.require("jwt")[0].version)) 
except Exception as e: 
    print "Failed to get version of jwt module via pkg_resources: {}".format(e) 

try: 
    print "pkg_resources.require('cryptography')[0].version = {}".format(str(pkg_resources.require("cryptography")[0].version)) 
except Exception as e: 
    print "Failed to get version of cryptography module via pkg_resources: {}".format(e) 

try: 
    print "original = {}".format(str(original)) 
    encoded = jwt.encode(original, my_private_key, algorithm='ES256') 
except Exception as e: 
    print "encoding exception = {}".format(str(e)) 
else: 
    try: 
     print "encoded = {}".format(str(encoded)) 
     unencoded = jwt.decode(encoded, my_public_key, algorithms=['ES256']) 
    except Exception as e: 
     print "decoding exception = {}".format(str(e)) 
    else: 
     print "unencoded = {}".format(str(unencoded)) 

環境Aで、符号化が成功した:

sys.version = 2.7.12 (default, Sep 1 2016, 22:14:00) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] 
dir(jwt) = ['DecodeError', 'ExpiredSignature', 'ExpiredSignatureError', 'ImmatureSignatureError', 'InvalidAudience', 'InvalidAudienceError', 'InvalidIssuedAtError', 'InvalidIssuer', 'InvalidIssuerError', 'InvalidTokenError', 'MissingRequiredClaimError', 'PyJWS', 'PyJWT', '__author__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__', '__package__', '__path__', '__title__', '__version__', 'algorithms', 'api_jws', 'api_jwt', 'compat', 'decode', 'encode', 'exceptions', 'get_unverified_header', 'register_algorithm', 'unregister_algorithm', 'utils'] 
dir(cryptography) = ['__about__', '__all__', '__author__', '__builtins__', '__copyright__', '__doc__', '__email__', '__file__', '__license__', '__name__', '__package__', '__path__', '__summary__', '__title__', '__uri__', '__version__', 'absolute_import', 'division', 'exceptions', 'hazmat', 'print_function', 'sys', 'utils', 'warnings'] 
jwt = 1.4.2 
cryptography = 1.5.2 
Failed to get version of jwt module via pkg_resources: jwt 
pkg_resources.require('cryptography')[0].version = 1.5.2 
original = {'Hello': 'World'} 
encoded = eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJIZWxsbyI6IldvcmxkIn0.ciaXCcO2gTqsQ4JUEKj5q4YX6vfHu33XY32g2MNIVEDXHNllpuqDCj-cCrlGPf6hGNifAJbNI9kBaAyuCIwyJQ 
unencoded = {u'Hello': u'World'} 

環境Bで

Iは環境A環境Bの両方に次のインストルメントコードを実行しましたエンコードが失敗します。 PyJWTのどのバージョンが動作しているのかわかりません。

sys.version = 2.7.12 (default, Sep 1 2016, 22:14:00) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]" 
dir(jwt) = ['DecodeError', 'ExpiredSignature', 'Mapping', 'PKCS1_v1_5', 'SHA256', 'SHA384', 'SHA512', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'base64', 'base64url_decode', 'base64url_encode', 'binascii', 'constant_time_compare', 'datetime', 'decode', 'encode', 'hashlib', 'header', 'hmac', 'json', 'load', 'signing_methods', 'sys', 'timegm', 'unicode_literals', 'verify_methods', 'verify_signature'] 
dir(cryptography) = ['__about__', '__all__', '__author__', '__builtins__', '__copyright__', '__doc__', '__email__', '__file__', '__license__', '__name__', '__package__', '__path__', '__summary__', '__title__', '__uri__', '__version__', 'absolute_import', 'division', 'print_function', 'sys', 'warnings'] 
Failed to get version of jwt module using .__version: 'module' object has no attribute '__version__' 
cryptography = 1.5.2 
Failed to get version of jwt module via pkg_resources: jwt 
pkg_resources.require('cryptography')[0].version = 1.5.2 
original = {'Hello': 'World'} 
encoding exception = Algorithm not supported 

答えて

3

PyJWT .__version__属性がthisコミットに0.2.2に登場:しかしPyJWTのこのバージョンでは、私が使用しようとしているアルゴリズムES256を持っていません。 pipは、パッケージをインストールするために使用された場合は

import pkg_resources 
print pkg_resources.require("jwt")[0].version 

すると、あなたはLinuxのシェルから試みることができる:

一般的に、setuptoolsの経由でインストールされたパッケージのバージョンを確認するには、次のコードを実行する必要があります。 pythonの内側から

pip show jwt | grep Version 

同じこと:

import pip 
print next(pip.commands.show.search_packages_info(['jwt']))['version'] 
+0

あなたはなぜこのことを知っていますかここで私にとってはうまくいかないのですか? https://gist.github.com/saqib-zmi/ac3d0f2106b76e729cfb54008995181d –

+0

その理由は、* setuptools *を使ってパッケージがインストールされていないからです。このコードでは、そのケースのバージョンのみを判別できます。 – table

+0

また、 'pip'が使われた場合、バージョンを知るコマンドに答えています。 – table

関連する問題