【问题标题】:pip install local package to target directorypip 将本地包安装到目标目录
【发布时间】:2017-11-29 05:56:52
【问题描述】:

我有一个发布到 PyPI 的 Python 库。在推送库的每个新版本之前,我想通过升级示例应用程序来测试它以使用新版本。

suggested method 这样做是使用-e (--editable) 标志在“开发模式”下工作:

$ pip install -e <my package root>

这确实将包安装到我的全局环境中。

但是,我的示例程序是为 Google App Engine 编写的,它要求将 all third-party libraries be copied 放入特定于应用程序的文件夹(在我的情况下为 ./lib)。我通常在这里使用-t (--target) 选项来安装软件包:

$ pip install -t lib/ <package>

但是,-e-t 选项 are not compatible 以及我尝试通过同时使用这两个标志将我的本地未发布库安装到指定目标文件夹的尝试都失败了。

如何在发布前通过将其安装在自定义目录中来测试我的库包?

【问题讨论】:

    标签: python google-app-engine pip


    【解决方案1】:

    对于新包的一次性测试,直接从本地文件系统安装似乎是最好的选择:

    $ cd /my/sample/application
    $ pip install -t lib /my/local/package
    

    当我对本地包进行进一步更改时,此安装不会保持同步(就像我使用 pip install --editable 时一样),但对于这个用例,我可以不用它。

    我无法让 @pbaranay's answer 工作,因为 pip install -e 使用 GAE 的 dev_appserver.py 脚本显然无法理解/遍历的“egg-info”文件的方式。不过,建议创建一个 virtualenv 并将其符号链接到 lib(而不是使用 -t 将软件包直接安装到 lib)是一个很好的建议。

    【讨论】:

    • 嘘,这对我有用。我无法使用--target 或--find-links 使其运行。谢谢
    【解决方案2】:

    改编自 Jeffrey Godwyll 的 Google App Engine Vendoring Done Right 的说明对我有用:

    cd ~/app-engine-project-directory
    mkdir lib
    ln -s env/lib/python2.7/site-packages lib
    pip install -e ../my-local-dependency
    

    (当然,根据您使用的 Python 版本,您可能需要更改第三行。)

    【讨论】:

    • 是的,这是管理依赖关系的好方法。不过,我认为mkdir lib 行不正确;如果目录已经存在,那么ln -s会链接lib/site-packages -&gt; env/lib/python2.7/site-packages,这不是我们想要的。
    • 不幸的是,pip install -e 在 site-packages 文件夹中创建了一个“egg-info”文件(穷人的符号链接),而 GAE dev_appserver.py 脚​​本显然无法跟随它。在任何情况下,应用程序在使用 dev_appserver.py 运行时都无法看到本地依赖项。
    • 我不推荐这种方法:您将所有您的本地安装包与您的应用一起上传,这意味着您可能会超出您的应用文件配额和/或您的可能会上传可能与沙箱冲突的库,从而导致您的应用在部署时出现模糊问题。
    • @DanCornilescu 此解决方案假设(基于链接源和env/lib... 的相对路径)使用项目特定的virtualenv。假设您只将项目实际需要的库安装到这个 virtualenv 中,为什么会比直接安装到 lib 更糟糕? (虽然我确实看到一个新的 virtualenv 默认安装 pip、setuptools 和 wheel,所以也许这就是你得到的......)
    • 你只安装到lib 你的应用程序绝对需要的东西——而不是你本地/virtenv 安装的所有东西。
    【解决方案3】:

    您可以使用 -e 将您的包安装到本地 python 安装或您想要的任何位置,然后将该特定本地包目录符号链接到您应用的 lib 目录:

    ln -s /my/local/package /my/sample/application/lib/
    

    【讨论】:

    • 使用-e 似乎只在site-packages 目录中创建了一个“egg-info”文件,它实际上并没有安装整个包(显然)。所以,似乎没有我可以符号链接的任何包?
    • 那么我想我误解了你的意图 -e 的用法,我虽然你得到了两者。您可能无法在 GAE 中使用此类库(但我不确定,从未尝试在 GAE 中使用鸡蛋)。
    猜你喜欢
    • 2021-10-31
    • 2015-12-21
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多