2

次のような要件ファイルがたくさんあるとします。

requirements.txt   # common for both 2.x and 3.x
requirements-2.txt # 2.x
requirements-3.txt # 3.x

現在のPythonインタープリターのバージョンに基づいて、ファイルにinstall_requires引数を入力したいと思います。もちろん、 pipがインストール プロセスを処理するsetup.pyと仮定します。

解決策 1:もちろん、正しい要件を読み取って返す単純な関数を作成できます。複数のプロジェクトの場合、関数をどこにでもコピーする必要があるため、これは明らかに受け入れられません。

解決策 2:ここでの次のアイデアは、私のためにそれを行う単純なパッケージを作成することですが、問題は、配布時 (のようにpython setup.py sdist) だけでなく、さらに重要なことに、マシンへのインストール時にも利用できる必要があることです。

私はそれを行う単純なモジュールを書くことができました.それを呼び出しましょうdepmodule. 私も以下を持っていましたsetup.py

# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

try:
    from depmodule import find_requirements
except ImportError:
    # this line is executed when reading setup.py for the first time
    # since depmodule is not installed yet
    find_requirements = lambda: []

setup(
    name='some-package',
    packages=find_packages(),
    # snip...
    platforms='any',

    # note that depmodule is listed here as a requirement, so it will be
    # installed before some-package, thus will be available when it comes
    # to running setup.py of some-package
    install_requires=['depmodule'] + find_requirements(),
)

それに関しては、pip install some-package実際には依存関係を正しく解決しますが、それらは pip によって取得されないため、インストールするだけです: depmodule some-package(その順序で) の代わりにdepmodule dep1 dep2 ... some-package.

引数を使用しようとしましsetup_requiresたが、運がありませんでした。依存関係はダウンロードされましたが、egg パッケージ (展開されていない) であるため、アクセスできませんでした。

この問題を克服する方法はありますか? これに役立つ代替手段 (他のアプローチ) はありますか?

ありがとう!

4

1 に答える 1

0

複数のプロジェクトのコードを複製したくない場合はsetup.py、単一のソースから setup.py の一部を生成および/または更新することを検討してください。これは、テンプレートMakefileからを生成するのと似ています。Makefile.in

私はpy_setupこれのためのプログラムを持っています。py_setup の一部をテンプレートとして使用して、現在のディレクトリにpy_setup --new新しいものを生成するために with で呼び出します。setup.pyファイル名を引数として を実行するpy_setupと、そのファイル内のセグメントを更新しようとしますが、残りのセグメントは変更されません。引数もオプションも指定せずに実行するとpy_setup、すべてのファイルのセグメントが更新され*/setup.pyます。

py_setup(および setup.py ファイル)のセグメントは、フォームのコメント行で区切られる#_## segement_nameか、#_#. セグメントの前またはセグメント間のものはすべてコピーされますが、実際のプログラム コードである実際のコードである py_setupsetup.py の行の後のものはコピーされません。#_###py_setup

ほとんどの行はそのままコピーされますが、セグメント区切りのコメント (セグメント名の後に取り除かれます) と次で始まる行は除きます。

setup = setup

その行からsetup =は開始時に削除されるため、 setup.py の setup() への呼び出しとして終了しますが、実行中の場合はそうではありませんpy_setup

更新時に、ターゲット内の既存のsetup.pyセグメントのみが、 内の同じ名前のセグメントからの行に置き換えられpy_setupます。セグメント名を削除または変更すると、コードの変更が更新されなくなります。

于 2013-03-12T16:23:57.747 に答える