如何获取pip安装的Python包的egg或wheel文件?

13

我在Spark的执行程序上遇到与这里描述的类似的导入错误,只是换成了psycopg2。

这里说:“虽然pandas过于复杂而不能作为*.py文件进行分发,但您可以创建一个egg文件及其依赖项,并将其发送到执行程序。”

所以问题是“如何从包和它的依赖关系创建egg文件?”或者如果eggs已经过时,则为wheel。在pip中有没有相应的命令?

2个回答

6

您想制作一个Python的wheel,与eggs相比,它们更加新颖、强大,并且支持Python 2/3。

对于像numpy这样流行的库,您不需要自己制作wheel。它们在其发行版中打包了wheels,因此您只需下载即可。许多Python库都会在其发行版中提供wheel。请参见这里:https://pypi.python.org/pypi/numpy

如果您感兴趣,可以在这里了解如何一般性地制作wheel:https://pip.pypa.io/en/stable/reference/pip_wheel/

或者,您可以直接在目标工作机器上安装numpy。

编辑:

根据您的评论,我认为有必要提到pipdeptree实用程序。如果您需要手动查看pip依赖项,此实用程序将为您列出它们。以下是一个示例:

$ pipdeptree
3to2==1.1.1
anaconda-navigator==1.2.1
ansible==2.2.1.0
  - jinja2 [required: <2.9, installed: 2.8]
    - MarkupSafe [required: Any, installed: 0.23]
  - paramiko [required: Any, installed: 2.1.1]
    - cryptography [required: >=1.1, installed: 1.4]
      - cffi [required: >=1.4.1, installed: 1.6.0]
        - pycparser [required: Any, installed: 2.14]
      - enum34 [required: Any, installed: 1.1.6]
      - idna [required: >=2.0, installed: 2.1]
      - ipaddress [required: Any, installed: 1.0.16]
      - pyasn1 [required: >=0.1.8, installed: 0.1.9]
      - setuptools [required: >=11.3, installed: 23.0.0]
      - six [required: >=1.4.1, installed: 1.10.0]
    - pyasn1 [required: >=0.1.7, installed: 0.1.9]
  - pycrypto [required: >=2.6, installed: 2.6.1]
  - PyYAML [required: Any, installed: 3.11]
  - setuptools [required: Any, installed: 23.0.0

如果你正在使用Pyspark并需要打包你的依赖项,pip不能自动为您完成此操作。 Pyspark具有自己的依赖项管理,pip对此一无所知。据我所知,最好的方法是手动列出依赖项并将它们推到Pyspark中。
此外,Pyspark并不依赖于numpy或psycopg2,因此如果您只告诉pip您的Pyspark版本,pip不可能告诉您需要它们。这种依赖关系是由您引入的,因此您需要将其提供给Pyspark。
顺便说一下,我们使用引导脚本在启动集群之前安装我们的依赖项(如numpy)。这似乎很有效。这样,您只需在脚本中列出所需的库,然后就可以忘记它们了。
希望能对你有所帮助。

1
是的,看到了。但是有很多这样的轮子,很难为我的系统选择正确的一个。pip 会以某种方式为我选择它。有没有办法告诉它加载它? - Bunyk
你试过用现有的轮子吗?Numpy在不同版本之间的兼容性非常好,接口相对稳定。 - Matt Messersmith
是的,我尝试了psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_x86_64.whl并且它对我有效。我只是想问一下是否有办法通过pip获取它,而不是使用wget,因为很难弄清楚我需要x86_64、i686还是其他什么。pip可以精确地知道软件包的信息。 - Bunyk
嗨@Bunyk,当你说“psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_x86_64.whl”可行时,是指你必须在集群的所有节点上安装它(使用引导脚本或pip),还是你能够将其作为--py-files直接在Spark上进行传输?谢谢。 - pippobaudos
1
@pippobaudos 噢,那已经快一年了,所以我可能记错了,但我想我以某种方式将wheel作为pyspark的--py-files参数进行了传输。因为在节点上,您可以按任何您想要的方式手动安装它,包括wheels、eggs或从源代码构建。 - Bunyk

3
您可以使用 pip install wheel 命令来安装 wheel
然后使用 python setup.py bdist_wheel 命令创建一个 .whl 文件。您会在 Python 包的根目录下的 dist 目录中找到该文件。如果您需要同时为 Python 2 和 Python 3 创建单个 .whl 文件,您可能还需要添加 --universal 参数。
更多关于 wheel 的信息请参阅 此处

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