2017-05-23 20 views
4

私は、連続ビルドサーバーで私のPythonプロジェクトのテストを実行するのにtoxcoverage.pyを使用しています。私はpython3.5 setup.py installを使ってインストールしたベンダー(PyPIでは利用できません)のpkg_xパッケージを持っています。これは/usr/lib/python3.5/site-packagesです。今では、そのパッケージをテストコードで利用できるようにする必要があります。Toxとlibとlib64とサイトパッケージ

私の現在のtox.iniは次のようになりません:

[tox] 
envlist = py35 

[testenv] 
deps = nose 
     coverage 
commands = coverage run -m nose [] 
sitepackages = True 

と、私はそうのようなテストを実行します。見事に失敗し

python3.5 -m tox -- --verbose --with-doctest 

を - 私の地元setup.py(例えば、公開に記載されている依存パッケージのどれも関連するパッケージを含むと思われる.tox/py35/lib/python3.5/site-packages/more_itertoolsのようなディレクトリを作成しても、more_itertoolsのようなもの)が見つかります。私は.tox/py35/bin/python3.5を起動した場合、sys.pathは次のようになります。

>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path] 
['', 
'.tox/py35/lib64/python35.zip', 
'.tox/py35/lib64/python3.5', 
'.tox/py35/lib64/python3.5/plat-linux', 
'.tox/py35/lib64/python3.5/lib-dynload', 
'/usr/lib64/python3.5', 
'/usr/lib/python3.5', 
'.tox/py35/lib/python3.5/site-packages'] 

私は私のtox.iniからsitepackages = True行を削除した場合、私は遠く得るか、という点でmore_itertoolsのようにパッケージ化し、私のsetup.py依存関係にあるものの残りの部分ができます今では見つかりましたが、上記のベンダーパッケージpkg_xはまだ見つかりません。そしてsys.pathは次のようになります。どちらの場合

>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path] 
['', 
'.tox/py35/lib64/python35.zip', 
'.tox/py35/lib64/python3.5', 
'.tox/py35/lib64/python3.5/plat-linux', 
'.tox/py35/lib64/python3.5/lib-dynload', 
'/usr/lib64/python3.5', 
'/usr/lib/python3.5', 
'.tox/py35/lib/python3.5/site-packages', 
'/usr/lib64/python3.5/site-packages', 
'/usr/lib/python3.5/site-packages'] 

.tox/py35/はどこかのベンダーのパッケージpkg_xを含んでいるように見えるん。ディレクトリ/usr/lib/python3.5/site-packagesが表示されますが、.tox/py35/bin/python3.5を手動で起動すると、テストを実行するときにpkg_xが実際に見つかりません。またsitepackages = Trueように見える

は右、 http://tox.readthedocs.io/en/latest/config.html#confval-sitepackages=True|Falseで行うことを文書化しているものとは逆の効果を持っていますか?

アドバイスありがとうございます!説明から

+0

私が見ているのと同じようなToxの問題にコメントを付けました:https://github.com/tox-dev/tox/issues/461#issuecomment-303855697 –

+0

'tox'はそれ自身を作成し​​ますvirtualenv's。あなたはvirtualenvにどのくらい精通していますか? '.tox'ディレクトリのvenvを有効にしてそこからデバッグしてください。 –

答えて

4

、私は怒らせるという意味ではありませんが、おそらくどのようにvirtualenvtox仕事のご理解が一緒に仕事を必要とします:

Toxvirtualenvを作成し、それはその環境内からテストだ実行されます。

--sitepackages引数は、virtualenvがグローバルにインストールされたパッケージにアクセスできるかどうかを判断するスイッチです。

toxを実行する「通常の」方法は、単にtoxと言うことになります。ピップまたはOSパッケージを介してインストールすることは、あなたのパスに入れてください。すなわち:言って同じである

$ tox 

:あなたが直接TOXを呼び出す

$ tox -c tox.ini 

python -m tox、それが何かをするかもしれないが、これは私には赤い旗です。このコマンドは、関連する仮想環境をアクティブにする可能性は低いと思われます。これは、パッケージの可用性の不安を説明します。sitepackagesを省略すると、仮想パッケージ内にあると考えて実際にグローバルパッケージを追加するので、実際にはグローバルではありますが、localサイトパッケージと思われるものが追加されます。グローバルパッケージを探しているときに見つけられないので、それを真実にすると、逆のことが起こります。どんなところでも、毒素を期待通りに呼び出さないので、私たちと同じように混乱します。

toxコマンドを使用してください。

もう少しお待ちください:必要なパッケージはありますが、pypiでは利用できません。だから毒素はどのようにそれをインストールするつもりですか? tox docsはいくつかの方法を示唆しています(requirements.txtを使用します)。しかし、ここではenvを有効にして手動でインストールするのが最も直接的です。

さらにデバッグする必要がある場合は、.toxディレクトリに移動し、手動でvenvを有効にしてください。例えば:

$ source .tox/testenv/bin/activate 

testenvあなたがtox.iniに括弧の間で使用される名前です)。

今、あなたは例えば前にそれをやったが、パッケージをインストールします。あなたはそれをこの方法を完了したらpip install pkg_x

はvenvを非アクティブ化します。

$ deactivate 

は今toxを試してみてください?

commands = coverage run -m nose [] 

これに:私たちは正しい軌道に乗っている場合は

は、それは私の問題への解決策のように見えるlearn more about virtualenv here

+0

ありがとう - 私の理解が必要なことは絶対に正しいと確信しています。しかし、仮想環境への事前インストールの推奨ソリューションは動作しません。これは、作業環境がすべての実行で再構築される継続的な構築サーバーにあるためです。テストが実行されるたびにインストールする必要があり、インストールには人間の操作が必要です。 –

+0

単純に 'tox'の代わりに' python3 -m tox'を使っているのは、 'tox'スクリプトのshebang行に依存するのではなく、Toxを呼び出すPythonのバージョンを制御できるからです。私はこれがサポートされたユースケースだと思いましたか? –

+1

依存関係については、toxの 'DEPS ='を使用してください。バージョンのために、それは毒の主要な販売ピッチです...それは同時に複数のバージョンのpythonをテストします。毒素の中の各環境を設定し、それぞれをビルドしてテストします。 [マニュアルの確認、 - )](http://tox.readthedocs.io/en/latest/example/basic.html) –

2

このことから私のtox.inicommandsラインを変更することです

commands = python -m coverage run -m nose [] 

効果はpythonがvirtualenvでマップされたコマンドになりました。これは正しいPyt honインタープリタ、coverageモジュールをロードして実行します。 python -mがなければ、実行可能ファイルcoverageが私のPATHにあり、予期しない結果が出るだけです。 whitelist_externalsを使用することもできますが、問題の原因となるのはバンド効果のみです。私もがsitepackages = Trueの行を追加します。場合

はその後、それが成功した私は、ベンダーからインストールpkg_xを見て、私のテストが成功します。

+1

上記のjohn-meeの答えは、私に必要な調査ツールを示しました。つまり、 .tox'ディレクトリに格納されています。 –

+0

もう1つのバリエーションは 'nosetests --with-coverage ... 'です。 –

関連する問題