2017-07-14 4 views
-1

私は助けてくれる知的悩みを持っています。以下の最初の2つのセクションではいくつかの前提を説明します。 3番目には質問が含まれています。私は元の質問の方が良い/掃除機/ etcを行う方法の提案に答えています。3.使いやすい2.7のPythonパッケージをテストする

セットアップは

私は2.7で始まるのPythonのすべてのバージョンではうまく機能(Requestsを使用して)HTTPベースのライブラリを開発しました。最近、ライブラリが非同期HTTPリクエストをaiohttp経由でサポートするように要求されました。間違いなくこのライブラリはPython> = 3.4.2を必要としています。

私はリクエストを取り除き、aiohttpで置き換えることができましたが、Python 2.xで動作するライブラリを必要とする私のユーザベースの割合はそれほど高くありません。そこで、両方のライブラリを適切な設定で使用することにしました。

EnvisionのHTTPトランザクションのすべてを行いClientオブジェクト:その時点Clientで...

client = mylib.Client(asynchronous=True) 

:考慮した後

import mylib 

client = mylib.Client() 
data = client.get() 
client.update_setting(<setting_id>) 
# etc. 

、私はこのような何かをしたいと思います今の方法では、非同期のaiottp駆動型を使用します。ユーザがPython < 3.4.2でこのようにClientをインスタンス化しようとすると、警告が記録され、ライブラリは同期Clientを使用してフォールバックします。

私は、この処理するために私のsetup.pyを構成した

を公開:

import sys 

import setuptools 

BASE_ASYNC_PYTHON_VER = int(hex(0x030402f0), 16) 
PACKAGES = ['mylib'] 
REQUIRED = ['requests'] 
EXTRAS = {} 

# Handles environments with old versions of setuptools: 
if int(setuptools.__version__.split(".", 1)[0]) < 18: 
    if sys.hexversion < BASE_ASYNC_PYTHON_VER: 
     REQUIRED.append('aiodns') 
     REQUIRED.append('aiohttp') 
     REQUIRED.append('cchardet') 
    else: 
     EXTRAS[":python_version>='3.4.2'"] = ['aiodns', 'aiohttp', 'cchardet'] 

# Removing extraneous stuff for this example: 
setuptools.setup(
    name='mylib', 
    version='1.0.0' 
    description='Just for grims', 
    packages=PACKAGES, 
    install_requires=REQUIRED, 
    extras_require=EXTRAS, 
:バージョン< 3.4.2はありませんが、Pythonのバージョン> = 3.4.2がaiohttp(およびその依存関係)をインストールしますが

これはきれいに動作します。Python 2のインストールでは余分なライブラリが不要になり、Python 3のインストールではそれが含まれます。

問題は、開発しながら、私は私の依存関係とvirtualenvのを管理するためにpipenvを使用して...

テスト

が付属しています。私Pipfileは、次のようになります「のみのPythonのバージョンX.Y.Zのためのパッケージをインストール」と言う方法があるように表示されていないこと、

[[source]] 
url = "https://pypi.python.org/simple" 
verify_ssl = true 

[dev-packages] 
detox = "*" 
pytest = "*" 
requests-mock = "*" 
tox = "*" 
twine = "*" 

[packages] 
aiodns = "*" 
aiohttp = "*" 
cchardet = "*" 
requests = "*" 

注意

私もtoxを使用して複数のPythonバージョン間でテストを実行します。私tox.iniは次のようになります。

[tox] 
envlist = py27, py36 

[testenv] 
passenv=HOME 
deps = pipenv 
commands= 
    pipenv install --dev 
    pipenv run py.test tests 

testspytestやさしいテス​​トの束が含まれている場合)

残念ながら、これはチョーク:py27py36の両方のために、すべてのパッケージをインストールするには、TOXの試みを(DEVと "通常")私のPipfileから; py27がaiohttpをインストールしようとすると、明らかにチョークします。

質問:どのようにして、このロジックと構造を備えたPythonの両方のバージョンを適切に(そしてPythonで)テストできますか?

答えて

0

私はこれに関するいくつかの調査をしましたが、完全な答えには至りませんでした。私は検索中に見つけた有用な情報を残しました。

pipfileは、おそらくdependency markersをサポートする必要があります。そこpipfile上「のはtomlを使用してみましょう」の問題でan exampleだと、それは次のようになります。

# environment markers 
SomeProject2 = {version = "==5.4", markers = {python_version = "< 2.7", sys_platform = "win32"}} 

これはtoml、pipfile、私は次のような問題に遭遇したpipenvの最新バージョンで動作するように取得しようとしているときtomlパーサのPython実装:https://github.com/uiri/toml/issues/118

別のノートでは、あなたは一般的にあなたのパッケージからビルドホイールに焼きを取得するこれらのようなあなたのsetup.py選択する依存関係に分岐ロジックを使用しないでください。私はwritten up slidesなぜそれがあなたがそれについてのより多くの情報を望むなら問題であるかについて。その作業を正常に行う方法については、tl;drも環境指定子を使用しています。

setup(
    ... 
    extras_require={ 
     ':python_version=="2.7"': ['functools32'], 
    }, 
) 
関連する問題