pip: 有没有方法可以避免--allow-external?

11 投票
2 回答
3566 浏览
提问于 2025-04-18 02:21

最近版本的 pip 安装工具不会自动安装那些没有把包文件上传到 PyPI 的软件包,除非用户明确提供 --allow-external 这个选项(相关回答)。

我想要发布一个依赖于这样的库的包,比如 dirspec。目前,我必须告诉我的包的用户通过以下命令来安装我的包:

$ pip install --allow-external dirspec MyPackage

当涉及到库的打包时,这就变得更加麻烦。如果我的包是一个库,我还得告诉依赖于我的包的其他包的作者,让他们的用户通过以下命令来安装他们的包:

$ pip install --allow-external dirspec TheirPackage

有没有什么办法可以避免这种情况呢?

2 个回答

6

你在问如何绕过一个安全功能。从外部网站安装东西而不告诉我,这可能会被认为是有害的。

可能有其他解决办法:要么让pip报错,告诉你需要的包无法找到,要么在你的安装代码中给出这样的指示。不过,第二种方法会失败,如果你真的声明了依赖这个包,因为pip会先尝试安装外部的那个包,这样就没机会让你的setup.py说话了。你需要让你的包不依赖于它,并在setup.py中打印出一个指示,告诉用户从外部网站安装某个包。这听起来更复杂。

我认为,像这种依赖外部包的情况会越来越普遍,所以pip会提供足够的提示,告诉你如何解决这种依赖问题。

补充:用当前版本的pip(1.5.4)测试安装时,发现有这样的提示,建议使用一个开关 --use-external。

$ pip install gitlle
Downloading/unpacking gittle
.....
Downloading/unpacking mimer (from gittle)
  Could not find any downloads that satisfy the requirement mimer (from gittle)
  Some externally hosted files were ignored (use --allow-external mimer to allow).
Cleaning up...
5

正确的做法是把需求文件放在你的压缩包里,或者放在一个包含你自己项目和其他项目的超级压缩包里。这样,pip就可以很顺利地从本地文件中安装这些依赖了。

撰写回答