代码之家  ›  专栏  ›  技术社区  ›  supertommy

如何让pip在目录中反复搜索包和依赖项?

  •  4
  • supertommy  · 技术社区  · 7 年前

    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
    

    此外,这些软件包可以是纯源代码的安装程序。py文件?或者它们是否需要像轮子或zip文件那样的二进制文件。最后,有没有解决依赖关系的方法?例如,如果packageA需要packageB的版本,pip可以从我的文件夹中获取该版本的packageB吗?我是否需要html文件来指示位置和内容?

    我知道我可以将pip直接指向本地路径( pip install C:\packages\packageA\1.0.0 ),但我希望它的功能就像这些包在PyPI中可用一样。例如,如果用户键入 pip install packageB pip install requirements.txt 而且该需求文件包含本地存在但不在PyPI中的包,它只会工作。(我可以在配置文件中设置本地包存储路径,以便pip命令不需要-f参数)

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

    2 回复  |  直到 7 年前
        1
  •  5
  •   supertommy    7 年前

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

    目录如下所示:

    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的文件夹。名称 易于理解的 似乎是政治公众人物503的事。在simple中,文件夹结构如下所示:

    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的兼容文件/文件夹布局。

    每个索引。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
    
        2
  •  0
  •   phd    7 年前

    pip是否能够递归搜索?

    不是。可以是一个平面目录,也可以是一个预先生成的html文件,其中列出了子目录中的文件。

    此外,这些软件包可以是纯源代码的安装程序。py文件?

    pip 可以安装源分发、鸡蛋和轮子。

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

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

    PS.防止 pip公司 要查看PyPI中的包,请使用选项 --no-index