首页 文章

使用pip将Python软件包从本地文件系统文件夹安装到virtualenv

提问于
浏览
229

是否可以使用本地文件系统中的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 .

7 回答

  • 20

    这很简单 . 您需要的命令是:

    pip install -e <DIRECTORY>
    

    请注意,该目录中必须包含 setup.py 文件

  • 340

    我正在安装 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.
    

    希望它可以帮到你 .

  • 0

    关于什么::

    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'的顶级目录 .

  • 23

    选项--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 folder AND pypi 安装软件包: pip install -r requirements/production.txt

    PS . 请参阅我的cookiecutter-djangopackage前叉,了解如何拆分需求并使用基于文件夹的需求组织 .

  • 5

    requirements.txtegg_dir 中的需求作为目录

    您可以构建本地缓存:

    $ pip download -r requirements.txt -d eggs_dir

    然后,使用“缓存”很简单,如:

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

  • 97

    这是我最终使用的解决方案:

    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 examples以及Rikard's answer another 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

  • 51

    我很确定你要找的是 --find-links 选项 .

    虽然您可能需要为本地包索引生成一个虚拟 index.html ,其中列出了指向所有包的链接 . 此工具有助于:

    https://github.com/wolever/pip2pi

相关问题