将本地包安装到目标目录的pip安装方法

8

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

建议的方法是使用-e--editable)标志在“开发模式”下工作:

$ pip install -e <my package root>

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

然而,我的示例程序是为Google App Engine编写的,它要求所有第三方库都被复制到一个特定的应用程序文件夹中(在我的情况下是./lib)。我通常使用pip的-t--target)选项在此处安装软件包:

$ pip install -t lib/ <package>

然而,似乎选项-e-t不兼容, 我曾尝试使用这两个标记一起将我的本地未发布的库安装到指定的目标文件夹中,但失败了。
我该如何在发布前通过将其安装在自定义目录中测试我的库包?
3个回答

4

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

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

我不打算使用pip install --editable,因为此安装无法随着我对本地包进行进一步更改而保持同步(与使用pip install --editable的情况不同),不过在这种情况下我可以接受。

我无法使@pbaranay的回答生效,因为pip install -e使用的“egg-info”文件的方式显然没有被GAE的dev_appserver.py脚本所理解或遍历。不过,创建virtualenv并将其符号链接到lib(而不是使用-t直接安装软件包到lib)的建议是很好的。


这对我起作用。我无法使用--target或--find-links运行它。谢谢。 - VarunS03

3

我根据 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 -> env/lib/python2.7/site-packages,这并不是我们想要的结果。 - Myk Willis
不幸的是,pip install -e 在 site-packages 文件夹中创建了一个“egg-info”文件(穷人的符号链接),而 GAE 的 dev_appserver.py 脚本显然无法跟随它。无论如何,当使用 dev_appserver.py 运行时,应用程序无法看到本地依赖项。 - Myk Willis
我不建议这种方法:您将上传所有本地安装包以及应用程序,这意味着您可能会超出应用文件配额和/或上传可能与沙盒冲突的库,在部署时导致应用程序出现晦涩的问题。 - Dan Cornilescu
@DanCornilescu 这个解决方案假设(基于链接的来源和相对路径到 env/lib...)你正在使用一个特定于项目的虚拟环境。假设你只在这个虚拟环境中安装了实际需要的库,那么为什么它会比直接安装到 lib 更糟呢?(尽管我确实看到一个新的虚拟环境默认安装 pip、setuptools 和 wheel,所以也许这就是你的意思……) - Myk Willis
你只需安装你的应用程序所绝对需要的内容到 lib 中,而不是从本地/虚拟环境安装所有内容。 - Dan Cornilescu

1
您可以使用-e将您的软件包安装到本地Python安装或任何您想要的位置,然后将该特定本地软件包目录的符号链接到您的应用程序的lib目录中:
ln -s /my/local/package /my/sample/application/lib/

使用 -e 似乎只会在 site-packages 目录中创建一个 "egg-info" 文件,它实际上并没有安装整个包(显然)。因此,似乎没有任何软件包可以进行符号链接? - Myk Willis
那么我猜我误解了你打算使用的 -e 用法,我以为你会得到两个。你可能无法在GAE中使用这样的库(但我不确定,从未尝试在GAE中使用eggs)。 - Dan Cornilescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接