如何pips recurisvely搜索目录的包和依赖项?

时间:2018-03-19 20:55:07

标签: python pip pypi python-wheel python-packaging

pip是否能够递归搜索文件系统路径并安装包及其依赖项?例如,给定以下文件结构(文件未显示)pip install packageA -f C:\packages\不起作用。

C:\packages\
C:\packages\packageA\
C:\packages\packageA\1.0.0
C:\packages\packageA\1.0.1

C:\packages\packageB\
C:\packages\packageB\2.2.1
C:\packages\packageB\2.2.4

此外,这些软件包可以使用setup.py文件作为纯源吗?或者他们需要像轮子或zip文件这样的二进制文件。最后,有没有办法解决依赖关系?例如,如果packageA需要一个版本的packageB,可以从我的文件夹中获取该版本的packageB吗?我是否需要html文件来指示哪些内容和内容是什么?

我知道我可以直接将pip指向本地路径(pip install C:\packages\packageA\1.0.0),但是我希望它能够像PyPI中的包一样运行。例如,如果用户键入pip install packageBpip install requirements.txt并且该需求文件包含本地但不存在于PyPI中的包,那么它将起作用。 (我可以在配置文件中设置本地包存储路径,因此pip命令不需要-f参数)

基本上,我想使用没有网络服务器的文件系统来复制PyPI功能(安全性不会让我们运行一个)。任何见解将不胜感激。

2 个答案:

答案 0 :(得分:2)

我想出来了。我使用了一个名为pip2pi的包。这个包有一个名为dir2pi的命令。我创建了一个包含tar.gz文件的目录。每个tar.gz文件都是使用this layout创建的Python包。为了识别版本,我添加了一个连字符,然后使用了语义版本。

目录看起来像这样:

C:\packages\package_a-1.0.8.tar.gz
C:\packages\package_a-1.1.0.tar.gz
C:\packages\package_b-2.0.0.tar.gz
C:\packages\package_c-1.0.5.tar.gz

然后我跑了,dir2pi C:\packages -S。这创建了必要的HTML文件和文件夹布局。在该文件夹的根目录下,创建了一个名为simple的文件夹。名称​​ simple 似乎是PEP 503的事情。简单来说,文件夹结构如下所示:

C:\packages\simple\index.html

C:\packages\simple\package_a
C:\packages\simple\package_a\index.html
C:\packages\simple\package_a\package_a-1.0.8.tar.gz
C:\packages\simple\package_a\package_a-1.1.1.tar.gz

C:\packages\simple\package_b
C:\packages\simple\package_b\index.html
C:\packages\simple\package_b\package_b-2.0.0.tar.gz

C:\packages\simple\package_c
C:\packages\simple\package_c\index.html
C:\packages\simple\package_c\package_c-1.0.5.tar.gz

这显然是pip的兼容文件/文件夹布局。

每个index.html文件都包含指向其相邻文件和文件夹的链接。例如,C:\packages\simple\index.html如下所示:

<html><head><title>Simple Index</title><meta name='api-version' value='2' /></head><body>
<a href='package_a/'>package_a</a><br />
<a href='package_b/'>package_b</a><br />
<a href='package_c/'>package_c</a><br />
</body></html>

C:\packages\simple\package_a\index.html看起来像这样:

<a href='package_a-1.0.8.tar.gz'>package_a-1.0.8.tar.gz</a><br />
<a href='package_a-1.1.1.tar.gz'>package_a-1.1.1.tar.gz</a><br />

现在有了正确的HTML文件和文件夹结构,我告诉pip在C:\packages\simple文件夹中查找包。我这样做是通过编辑pip.ini文件(位置因系统而异)并添加以下行:

[global]
extra-index-url = file:///c:/packages/simple

或者,我也可以将此文件夹作为参数传递给pip,如下所示:

pip install --index-url=file:///c:/packages/simple package_a==1.1.1

答案 1 :(得分:0)

  

pip是否能够递归搜索...?

没有。一个平面目录或预先生成的html文件,列出子目录中的文件。

  

此外,这些软件包可以是一个带有setup.py文件的纯源吗?

是。 pip可以安装源代码,鸡蛋和轮子。

  

最后,有没有办法解决依赖关系?

是的,但必须可以访问它们。也就是说,类似PyPI的服务器(不一定是PyPI),一个平面目录或一个html文件。

PS。为了防止pip在PyPI使用选项--no-index查找包。