ローカルファイルシステムフォルダーからpipを使用してvirtualenvにPythonパッケージをインストールする


346

ローカルファイルシステムからpipを使用してパッケージをインストールすることは可能ですか?

python setup.py sdist適切なtar.gzファイルを作成したパッケージを実行しました。このファイルは私のシステムのに保存されています/srv/pkg/mypackage/mypackage-0.1.0.tar.gz

次に、仮想環境で、pypiまたは特定のローカルの場所から取得したパッケージをインストールしたいと思います/srv/pkg

これは可能ですか?

PS 私は私が指定できることを知っていますpip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz。それはうまくいきますが、私は/srv/pkg入力しpip install mypackageた場合に、その場所をpipが検索するための別の場所として使用することについて話しています。


WHLホイールから、setup.pyなしでPyPiパッケージをインストールしようとしていましたが、Pythonバージョンの正しいバージョンをダウンロードして実行した後にインストールされましたpip install <Path-to-WHL-file>
WiktorStribiżew16年

回答:


136

私はあなたが探しているものは--find-linksオプションと呼ばれていると確信しています。

ただしindex.html、すべてのパッケージへのリンクをリストするローカルパッケージインデックスのダミーを生成する必要がある場合があります。このツールは次のことに役立ちます。

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackageうまくいくはずです。
jfs

1
それは役立ちます。また、pipの-iオプションを使用して、ローカルのPyPIとして扱うことができます。
diabloneo

同等のeasy_installコマンドはeasy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughesの

それが機能する前に、プロジェクトまたはパッケージディレクトリを指すだけでなく、ソース配布ファイルを作成する必要がありました。これは私をつまずかせました。docs.python.org/3.6/distutils/sourcedist.html
Josh

3
--find-links指定した場所にパッケージが見つからない場合、または新しいバージョンが利用可能な場合でも、は引き続きPyPIでの検索を許可します。Windowsでは、これを--only-binary=packagename(または--only-binary=:all:)と組み合わせると非常に便利です。これにより、pipは、PyPI上のソース配布のみを持つ(したがって、コンパイルが必要になる)ネイティブ依存関係のあるパッケージをダウンロードしようとしなくなります。これは、ディレクトリからインストールしようとする最も一般的な理由です。とは異なり--no-index、PyPIから他のパッケージをインストールできます。
jpmc26

463

何について::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

例えば、 pip install -e /srv/pkg

/ srv / pkgは、「setup.py」が見つかるトップレベルのディレクトリです。


49
これにより、パッケージが開発モードでインストールされます。つまり、ソースが存在する場所にリンクするだけです。ソースが移動または削除された場合、パッケージのインポートは失敗します。
Trasplazio Garzuglio 2015年

3
@MarcoDinacci興味深いの--editableは、ローカルパッケージのディレクトリを調べて、存在する場合はソースをgitリポジトリとして設定しているように見えることです。フォルダよりも少し柔軟性があります。ただし、このドキュメントは見つかりません。
NotSimon 2015

3
これは、特定のパッケージ、特にローカルマシンまたはVCSのURLで現在/集中的に開発されているパッケージのインストールに適しています。特定の1つのパッケージソースではなく、すべてのローカルパッケージソースの親ディレクトリを検索することについての質問には答えません。受け入れられた回答は、pipインストール元の複数のパッケージを含むディレクトリまたはURLがある場合に機能します。
Gavinが2016年

@MarcoDinacciただし、ユーザーがコードをダウンロードしたとします。彼らはそれがインテリジェントであるならば、彼らがプログラムが欲しいところにそれを置きます。なぜ彼らはそれを動かしたいのでしょうか?
Zelphir Kaltstahl 2016年

1
@Simonは、gitリポジトリを検索しないようにpipに指示する方法はありますか?do pip install -egitリモートからコードをチェックアウトする場合、コードをそのままインストールします(変更はまだリモートにはありません)。
Pedru

39

インストールしてpyfuzzyいますが、PyPIにはありません。次のメッセージが返されますNo matching distribution found for pyfuzzy

受け入れられた答えを試しました

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

しかし、それも機能せず、次のエラーを返します。

インデックスを無視:https : //pypi.python.org/simple pyfuzzyの収集要件pyfuzzyを満たすバージョンが見つかりませんでした(バージョンから:) pyfuzzyに一致する分布が見つかりません

最後に、私はそこに簡単な良い方法を見つけました:https : //pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

したがって、次のコマンドは私にとってはうまくいきました:

pip install ../pyfuzzy-0.1.0.tar.gz.

それがあなたを助けることを願っています。


4
これでうまくいきました。私は他の方法を試しましたが、Could not find a version that satisfiesエラーに遭遇しました。ありがとう。
RAIR

21

これは私が最終的に使用したソリューションです:

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

これをpipインストールの例と、別の質問に対するリカードの回答からまとめました。「--pre」引数を使用すると、非本番バージョンをインストールできます。「--no-index」引数は、PyPIインデックスの検索を回避します。「--find-links =」。引数はローカルフォルダーを検索します(これは相対または絶対にできます)。「--log-file」、「log.txt」、および「-vv」引数をデバッグに使用しました。「--upgrade」引数を使用すると、古いバージョンの上に新しいバージョンをインストールできます。

私はそれらをアンインストールする良い方法も見つけました。これは、いくつかの異なるPython環境がある場合に役立ちます。これは基本的なフォーマットは同じですが、「install」ではなく「uninstall」を使用するだけで、意図しないアンインストールを防ぐための安全対策が施されています。

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

ローカルフォルダーには次のファイルが含まれています:install.py、uninstall.py、mypackagename-1.0.zip


1
ありがとう。「--find-links =」。そして、「-no-index」は、私のユーティリティパッケージ内のpythonスクリプトを接着する際の鍵であり、最初にsite-packagesからold-version-packageを削除してから、サブディレクトリからtar.gzされたパッケージをインストールします。次に、utility-package-folder(--find-links =については知らなかった)を作成し、ホイールを作成してインストールします。すべてplumbumとクリックで自動化されています。誰かがそれを望んでいるなら、私はリンクを投稿します。賛成。
JackLeEmmerdeur 2016

15

オプション--find-linksは仕事をし、requirements.txtファイルから機能します!

あなたは、いくつかのフォルダにあるパッケージアーカイブを入れて、例えば、要件ファイルを変更することなく、最新のものを取ることができますrequirements

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

今すぐにrequirements/base.txt

--find-links=requirements
foo_bar
wiz_bang>=0.8

プロプライエタリパッケージを更新するには、フォルダーに新しいパッケージをドロップするだけです。

このようにして、同じ単一の呼び出しでlocal folderAND からパッケージをインストールできますpypipip install -r requirements/production.txt

PS。要件を分割し、フォルダーベースの要件組織を使用する方法については、cookiecutter-djangopackageフォークを参照してください。


ありがとう、これは私が考えていたものよりもさらに良いです!
FoundNil

11

インストールパッケージのページから、次のコマンドを実行するだけです。

pip install / srv / pkg / mypackage

どこ/ SRV / PKG / mypackageと含む、ディレクトリですsetup.pyを


さらに1、アーカイブファイルからインストールできます。

pip install ./mypackage-1.0.4.tar.gz

1 質問には記載されていますが、人気があるため含まれています。


2
これがデフォルトの答えです。パッケージがローカルマシンのどこにあるかが正確にわかっている場合は、-find-linksを使用してpipを探す必要はありません。
ロバート

6

virtualenvとrequirements.txtファイルがあるとすると、このファイル内でパッケージを取得する場所を定義できます。

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

ディレクトリ内requirements.txtおよびegg_dirディレクトリとしての要件

ローカルキャッシュを構築できます。

$ pip download -r requirements.txt -d eggs_dir

次に、その「キャッシュ」の使用は次のように簡単です。

$ pip install -r requirements.txt --find-links=eggs_dir


1

ローカルからのみインストールするには、2つのオプションが必要です。

  • --find-links:依存関係を探す場所。他の人がfile://言及する接頭辞は必要ありません。
  • --no-index:欠落している依存関係(依存関係がインストールされておらず、--find-linksパスに含まれていない)のpypiインデックスを調べません。

したがって、次のフォルダから実行できます。

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

mypackageが適切に設定されている場合、すべての依存関係が一覧表示され、pip downloadを使用して一連の依存関係(つまり、依存関係の依存関係など)をダウンロードした場合、すべてが機能します。

アクセス可能な場合はpypiインデックスを使用し、アクセスできない場合はローカルホイールにフォールバックする場合は、を削除--no-indexして追加でき--retries 0ます。欠落している依存関係(1つはインストールされていない)がないかpypiをチェックしようとしている間、少しの間pip pauseが表示され、到達できない場合はローカルにフォールバックします。「最初にローカルのものを探し、次にインデックスを探す」ようにpipに指示する方法はないようです。


-1

私は本当にシンプルなものを成し遂げようと努力してきました、そして無惨に失敗しました、おそらく私は愚かです。

とにかく、Dockerfile(たとえばGitHubから)pythonパッケージのzipファイルをダウンロードするscript /があり、それをインストールする場合はfile:///、次の例に示すように、プレフィックスを使用してインストールできます。

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

:私はあなたがすぐにパッケージをインストールできることを知っていますpip install https://example.com/mypackage.zipが、私の場合、チェックサムを確認したかった(決して偏執狂ではありません)と、pipが提供するさまざまなオプション/ #md5フラグメントを使用しようとすると、惨めに失敗しました。

で非常に単純なことを直接実行するのは驚くほどイライラさせられましたpip。チェックサムを渡しpip、zipが以前一致していたことを確認したかっただけです。インストールです。

私はおそらく非常に愚かなことをしていましたが、結局私はあきらめてこれを選びました。私はそれが同様のことをしようとしている他の人を助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.