2017-11-03 11 views
6

subprocess32に依存するライブラリ(subx)があります。 subprocess32ライブラリはPython2.7のバックポートであり、タイムアウトkwargを提供します。依存関係管理:Python2.7に必要なサブプロセス32

私のライブラリにはタイムアウトkwargが必要です。

ターゲットプラットフォームがPython2.xの場合のみ、サブプロセス32が必要です。

プロジェクトで依存関係をどのように定義する必要がありますか? 、

===> pip install -e git+https://github.com/guettli/subx.git#egg=subx 
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx 
    Cloning https://github.com/guettli/subx.git to ./src/subx 
Collecting subprocess32 (from subx) 
    Using cached subprocess32-3.2.7.tar.gz 
    Complete output from command python setup.py egg_info: 
    This backport is for Python 2.x only. 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/ 

答えて

6

は、宣言的な方法があります:私は "install_requires"(setup.py)を介してsubprocess32への依存関係を定義した場合

私は、このエラーメッセージを取得し、私はのpython3のvirtualenvの内側にしていますしかし、それよりも遅いバージョンのsetuptoolsが必要です(私がrelease notesを正しく読んでいれば、少なくとも20.2バージョンが必要です)。下に表示されているものは環境マーカーと呼ばれ、PEP 508で指定されています。利用可能なマーカーの完全なリストと、必要に応じてマーカーの構文を理解しています。

python版では、環境にインストールする必要があるsubprocess32依存関係があります。このようなあなたの依存関係を強化:python2.7でパッケージsubxをインストール

install_requires=[ 
    'subprocess32; python_version<"3"', 
] 

は現在得られます

Processing ./dist/subx-2017.8.0-py2-none-any.whl 
Collecting subprocess32; python_version < "3" (from subx==2017.8.0) 
Installing collected packages: subprocess32, subx 
Successfully installed subprocess32-3.2.7 subx-2017.8.0 

あなたはpython3.Xでそれをインストールした場合、出力は次のようになります。

Processing ./dist/subx-2017.8.0-py3-none-any.whl 
Installing collected packages: subx 
Successfully installed subx-2017.8.0 

ていることに注意してくださいsubprocess32のインストールはスキップされます。


別の一般的な例は、プラットフォーム固有の依存関係を宣言することです:私はMacOSの上のLinuxにインストールするauditwheeldelocateを必要とするプロジェクトを持っています。

$ python2 -c "import sys; print sys.platform" 
linux2 

しかし

$ python3 -c "import sys; print sys.platform" 
linux 

ので:あなたは、具体的理由はすべての主要なPythonのバージョンを対象としていない場合は、Linux用には、このチェックが必要であること

install_requires=[ 
    ... 
    'auditwheel==1.7.0; "linux" in sys_platform', 
    'delocate==0.7.1; "darwin" == sys_platform', 
] 

注:私はこのような依存関係を宣言しますたとえば、パッケージがpython2.Xとしか動作しない場合は、チェック"linux2" == sys.platformを使用することができます。これにより、あなたの依存関係はpython2.Xでのみインストール可能になります。

+0

これは完全な答えと思われます。しかし、Windowsの 'sys.platform'は、Windowsの場合は' win32'を、Windows/Cygwinの場合は 'cygwin'を出力します。 –

+0

@ElisByberi afaikの基本式がサポートされているので、 '' win32 "== sys_platformまたは" cygwin "== sys_platform'が動作するはずです。しかし、 'platform_system'のような他の環境マーカーがあります。これはおそらくこのケースに適しています。再度、[PEP 508](https://www.python.org/dev/peps/pep-0508/#environment-markers)で詳細を確認してください。 – hoefling

5
import sys 

kw = {} 
if sys.version_info[0] == 2: 
    kw['install_requires'] = ['subprocess32'] 

setup(
    … 
    **kw 
) 
+3

コードの動作の説明を追加することを強くお勧めします。単にコードを提供するだけでは、プログラミングを学ぶ上で最良の方法ではなく、ポストクリエイターにとってはそれがうまく説明されていれば利益を得ることはありません。詳細な回答があれば、コミュニティでの信頼性が確立され、あなたの回答によって投票が行われます。 –

+0

はい、動作します。しかし、もっと宣言的な解決方法があるかどうかは私自身に尋ねます。これはプログラミングのように見えますが、依存関係は定義されていません。私を間違えないでください。あなたの答えをありがとう! – guettli

+0

このアプローチはソースタールでのみ機能しますが、ホイールでは失敗します。 – hoefling