web-dev-qa-db-ja.com

pipはsetup.pyのdependency_linksを無視します

Setup.pyにdependency_linksがあります:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#Egg=python-s3'],
...

しかし、それは機能しません。ただし、install_requiresは正常に機能します。たぶん、setup.pyに必要なgitリポジトリを設定する別の方法がありますか?

60
syabro

この回答 役立つはずです。簡単に言えば、#Egg=python-s3のように見えるように、#Egg=python-s3-1.0.0のバージョン(または "dev")を指定する必要があります。

@Cerinのコメントに基づく更新:

  • Pip 1.5.xには、依存関係リンク処理を有効にするフラグ --process-dependency-links があります。以下の点に同意するため、テストしていません。
  • この説明 は、pipに依存リンクを使用することは悪い習慣であることを示しているようです。この機能は非推奨のために登録されましたが、もうありません。プライベートパッケージには有効な使用例があります。
57
Laur Ivan

これは古い質問だと思いますが、私と同じようにここにいる場合は、これが私にとってうまくいったことです。

他のGitHub(pypi以外)パッケージに依存するGitHub(pypiに登録されていない)にパッケージがあります。これを正しく処理するためにピップを取得する方法を見つけようとして、私は膨大な時間を費やしました。ここで修正するために行ったことを含めます。

Requirements.txtファイルに依存関係を置くことは、依存関係をリストする好ましい方法です。ただし、セットアップでinstall_requiresを設定する必要もあります。この段階で、pitがGitHubから依存関係をインストールしたくないという障害に遭遇しました。

この質問への回答を含むほとんどの場所では、セットアップのdependency_linksセクションにデータを入力するように指示しています。 ただし、dependency_linksで参照されるパッケージの名前をinstall_requiresフィールドに入力する必要もあります。

たとえば、requirements.txtに次が含まれている場合。

somepackage==1.2.0
https://github.com/user/repo/tarball/master#Egg=repo-1.0.0
anotherpackage==4.2.1

次に、セットアップコールは次のようになります。

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#Egg=repo-1.0.0'
    ]
)

さて、これでパッケージの構成が完了しました。インストールは次のタスクです。これは私が多くの時間を費やした場所です。 dependency_linksの指定が明らかに何もしない理由を理解できませんでした。秘Theは、場合によっては、pipに対してallow-all-external(より具体的な場合もあります)フラグを設定する必要があることです。例えば:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

完了し、動作します!

免責事項:dependency_linksとフラグprocess-dependency-linksとallow-all-externalは廃止予定なので、すぐに削除されます。私が費やした時間では、より良い、好まれる方法を見つけることができず、ピップ機能はまだ適切にありました。

43
Chad

pipバージョン18.1 PEP 508 URL がサポートされているため。つまり、廃止されたdependency_linksはもう必要ありません。代わりに、install_requiresリストに直接依存関係を記述します。 @Chadの例は次のようになります。

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0 @ https://github.com/user/archive/master.Zip#Egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)

パッケージをインストールするには、次のように書くことができます。

pip install yourpackage

(--process-dependency-linksなし)

16
Easy_Israel

特にプライベートリポジトリからインストールする場合に見つかったいくつかの問題に関するいくつかのメモ。

Pipとsetuptoolsからのインストールには、若干の違いがあります。しかし、この方法は両方で機能するはずです。

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#Egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

ここにいくつかの注意事項があります:

  • プライベートリポジトリの場合、GitHubで認証する必要があります。私が見つけた最も簡単な方法は、oauthトークンを作成し、それを環境にドロップし、それをURLに含めることです。
  • PyPIにパッケージがない場合でも、リンクの最後にsomeバージョン番号(ここでは0)を含める必要があります。これは、Wordではなく、実際の数字でなければなりません。
  • Zip/tarballを指すのではなく、リポジトリのクローンを作成することをsetuptoolsに伝えるには、git+を先頭に付ける必要があります
  • versionは、ブランチ、タグ、またはコミットハッシュにすることができます
  • Pipからインストールする場合は、--process-dependency-linksを指定する必要があります
13
Maximilian

これは新しい構文であるため、最初にpipバージョンをアップグレードします。

pip install pip --upgrade

次に、以下を実行します。

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.Zip#Egg=bleualign-git-1.0.0'
]
  • バージョン1.0.0および名前「bluealign-git」はランダムに選択されます。
  • バージョン番号が必要です。
  • メインリポジトリバージョンと区別するために、「bleualign-git」という名前を使用することをお勧めします。

お役に立てれば。

コメント:

良い答え(賛成)。ただし、実際の結果はプラットフォームやpipのバージョンに依存する可能性が高いことにも言及してください。 動作するとき 、または 一見動作するが、指定されたリンクから依存関係を実際にプルしなかった 、または単純に 拒否されている を見ました。そのため、これを短時間の回避策としてのみ使用することになるでしょう。可能な限り主流の方法に固執します。

4
Tobias Ernst