私は助けてくれる知的悩みを持っています。以下の最初の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
(tests
がpytestやさしいテストの束が含まれている場合)
残念ながら、これはチョーク:py27
とpy36
の両方のために、すべてのパッケージをインストールするには、TOXの試みを(DEVと "通常")私のPipfile
から; py27
がaiohttpをインストールしようとすると、明らかにチョークします。
質問:どのようにして、このロジックと構造を備えたPythonの両方のバージョンを適切に(そしてPythonで)テストできますか?