2013-02-22 275 views
173

是否可以使用來自本地文件系統的pip安裝包?使用pip從本地文件系統文件夾安裝Python包

我爲我的軟件包運行了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

+0

我一直在尋找一個安裝包的PyPI沒有setup.py,從WHL輪,並且它得到了安裝在我爲我的Python版本下載了正確的版本之後,運行'pip install '。 – 2016-01-20 08:03:39

+0

相關:[如何根據requirements.txt從本地目錄安裝軟件包?](http://stackoverflow.com/q/7225900/95735) – 2016-03-25 07:56:08

回答

74

我很確定你要找的是--find-links選項。

儘管您可能需要爲您的本地包索引生成一個虛擬index.html,其中列出了所有包的鏈接。此工具可幫助:

https://github.com/wolever/pip2pi

+47

'pip install mypackage --no-index --find-links file:/// srv/pkg/mypackage'應該可以工作。 – jfs 2013-02-22 19:49:56

+0

這是有效的。這並不理想,但它非常好。謝謝。 – chadgh 2013-02-22 20:21:02

+1

它確實有幫助。我們可以使用pip的* -i *選項將其視爲本地PyPI。 – diabloneo 2015-06-12 07:37:27

290

什麼::

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' 可以找到。

+28

這將在開發模式下安裝軟件包,這意味着它只會鏈接回到哪裏來源是。如果任何機會移動或刪除源,導入包將失敗。 – 2015-06-01 16:54:55

+2

@MarcoDinacci「--editable」的有趣之處在於它似乎查看本地軟件包的目錄,並將源設置爲git repo(如果存在的話) - 比只是一個文件夾更靈活一些。我找不到這個文件。 – Simon 2015-08-11 18:46:21

+0

在窗戶上也能很好地工作。應該是被接受的答案。 – miguelr 2015-12-08 06:31:23

17

這是我最終使用的解決方案:

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 install examplesRikard's answeranother question拼湊在一起,這也爲。 「--pre」參數允許您安裝非生產版本。 「--no-index」參數避免搜索PyPI索引。 「--find-links =」。參數搜索本地文件夾(這可以是相對或絕對的)。我使用「--log-file」,「log.txt」和「-vv」參數進行調試。 「--upgrade」參數可以讓你安裝比舊版本更新的版本。

我還發現了一個很好的卸載方法。當你有幾個不同的Python環境時,這很有用。這是相同的基本格式,只是用「卸載」,而不是「裝」,有安全措施,以防止意外卸載次數:

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腳本,它首先從站點包中刪除舊版本軟件包,然後從子目錄安裝一個tar.gz格式的軟件包工具包文件夾(不知道--find-links =。),然後創建輪子並安裝它。所有自動化通過鉛和點擊。如果有人想要它,我會發佈一個鏈接。 Upvoted。 – user3469861 2016-08-03 15:00:53

15

我正在安裝pyfuzzy。它不在PyPI中,「沒有找到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。現在效果很好。希望能幫助你。

1

一個選項--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 

一種巧妙的方法更新專有軟件包,只需在文件夾中放入新文件夾

通過這種方式,您可以安裝來自的軟件包和pypi具有相同的單一呼叫:pip install -r requirements/production.txt

PS。請參閱我的cokiecutter-djangopackage分支,瞭解如何拆分需求並使用基於文件夾的需求組織。

25

這很簡單。你需要的命令是:

pip install -e <DIRECTORY> 

注意,目錄必須setup.py文件中它