gpt4 book ai didi

裤子包括 OS X 特定的 Python 轮子

转载 作者:行者123 更新时间:2023-12-03 09:50:04 28 4
gpt4 key购买 nike

TLDR :裤子获取 OS X 特定的轮子,因为我正在 Mac 上开发。我怎样才能避免这种情况,或者指定我将部署到 Ubuntu?

全文 :

尝试使用 Pants 打包 Python 应用程序。到目前为止一切顺利,但遇到了一个我一直坚持一段时间的问题。我在 macbook 上开发,但部署到 EC2 Ubuntu。

这是我到目前为止所做的:

  • 创建了虚拟环境。
  • 向应用程序添加了 BUILD 文件,带有 suggested 3rd party pattern对于第三方包。
  • ./pants run.py backend:admin_server运行良好并生成dist/admin_server.pex
  • Scp 那个 .pex 到一个新的 EC2 Ubuntu 盒子上。

  • 但是,当我在那里运行应用程序时,我得到:
    Failed to execute PEX file, missing compatible dependencies for:
    mysql-python
    pycrypto

    问题似乎是 Pants 为这些 2 采用了 OS X 特定的轮子:

    pex: - MySQL_python-1.2.5-cp27-none-macosx_10_11_intel.whl
    pex:-pycrypto-2.6.1-cp27-none-macosx_10_11_intel.whl

    我怎样才能避免这种情况,或者指定它们应该在哪个操作系统上运行?

    这是完整的输出:
    ubuntu@ip-***:~$ export PEX_VERBOSE=1
    ubuntu@ip-***:~$ python admin_server.pex
    pex: Found site-library: /usr/local/lib/python2.7/dist-packages
    pex: Found site-library: /usr/lib/python2.7/dist-packages
    pex: Tainted path element: /usr/local/lib/python2.7/dist-packages
    pex: Tainted path element: /usr/lib/python2.7/dist-packages
    pex: Scrubbing from site-packages: /usr/local/lib/python2.7/dist-packages
    pex: Scrubbing from site-packages: /usr/lib/python2.7/dist-packages
    pex: Scrubbing from user site: /home/ubuntu/.local/lib/python2.7/site-packages
    pex: Failed to resolve a requirement: MySQL-python==1.2.5
    pex: Failed to resolve a requirement: pycrypto==2.6.1
    pex: Unresolved requirements:
    pex: - mysql-python
    pex: - pycrypto
    pex: Distributions contained within this pex:
    pex: - six-1.10.0-py2.py3-none-any.whl
    pex: - protobuf-2.6.1-py2.7.egg
    pex: - setuptools-19.5-py2.py3-none-any.whl
    pex: - MySQL_python-1.2.5-cp27-none-macosx_10_11_intel.whl
    pex: - pycrypto-2.6.1-cp27-none-macosx_10_11_intel.whl
    pex: - futures-3.0.4-py2-none-any.whl
    pex: - webapp2-2.5.2-py2-none-any.whl
    pex: - requests-2.9.0-py2.py3-none-any.whl
    pex: - jmespath-0.9.0-py2.py3-none-any.whl
    pex: - beautifulsoup4-4.4.1-py2-none-any.whl
    pex: - python_dateutil-2.4.2-py2.py3-none-any.whl
    pex: - boto3-1.2.3-py2.py3-none-any.whl
    pex: - WebOb-1.5.1-py2.py3-none-any.whl
    pex: - cssutils-1.0.1-py2-none-any.whl
    pex: - webapp2_static-0.1-py2-none-any.whl
    pex: - Paste-2.0.2-py2-none-any.whl
    pex: - docutils-0.12-py2-none-any.whl
    pex: - botocore-1.3.22-py2.py3-none-any.whl
    pex: - protobuf_to_dict-0.1.0-py2-none-any.whl
    Failed to execute PEX file, missing compatible dependencies for:
    mysql-python
    pycrypto

    PS:为了确保我没有包含我的 python 库版本,我 pip 卸载了 PyCrypto 和 MySQL-Python。

    最佳答案

    将项目分发为 PEX 文件的好处之一是您可以准备好它以在多个平台上运行。例如,一个 PEX 可以在 Linux 和 Mac 平台上运行。对于许多项目,除了构建 PEX 之外没有什么特别的事情可做。但是当您的项目依赖于特定平台的二进制代码时,您将需要执行一些额外的步骤。
    psutil 是包含平台特定代码的库的一个示例。图书馆。它包含在安装模块时编译到共享库中的 C 代码。要创建包含此类依赖项的 PEX 文件,您必须首先为所有平台提供该库的预构建版本,而不是运行裤子的平台。

    预构建库的最简单方法是使用 pip 工具来构建轮子。

    这个食谱假设如下:

  • 您想构建一个多平台 pex 以在 Linux 和 mac 上运行
    您将在 Linux 环境中预先构建库,
    然后在mac环境上构建PEX。
  • 您的项目目录位于 ~/src/cookbook


  • 让我们用一个简单的程序引用一个库并从中创建一个 pex。
    #  src/python/ps_example/main.py
    import psutil

    for proc in psutil.process_iter():
    try:
    pinfo = proc.as_dict(attrs=['pid', 'name'])
    except psutil.NoSuchProcess:
    pass
    else:
    print(pinfo)

    使用 Pants,您可以通过在 BUILD 文件中定义 python_binary 目标来定义可执行文件:
    # src/python/ps_example/BUILD
    python_binary(name='ps_example',
    source = 'main.py',
    dependencies = [
    ':psutil', # defined in requirements.txt
    ],
    )

    # Defines targets from specifications in requirements.txt
    python_requirements()

    在同一目录中,列出 requirements.txt 文件中的 python 库:
    # src/python/ps_example/requirements.txt 
    psutil==3.1.1

    现在,要制作多平台 pex,您需要访问 Linux 框来创建 psutil wheel 的 linux 版本。将 requirements.txt 文件复制到 linux 机器,然后,执行 pip 工具:
    linux $ mkdir ~/src/cookbook/wheelhouse
    linux $ pip wheel -r src/python/multi-platform/requirements.txt \
    --wheel-dir=~/src/cookbook/wheelhouse

    这将创建一个特定于平台的轮文件。
    linux $ ls ~/src/cookbook/wheelhouse/
    psutil-3.1.1-cp27-none-linux_x86_64.whl

    现在,您需要将平台特定的轮子复制到要构建多平台 pex 的机器上(在这种情况下,您的 mac 笔记本电脑)。如果你经常使用这个秘籍,你可能想要配置一个 Python Respository 来存储你预先构建的库。

    我们将使用与上面相同的 BUILD 文件设置,但修改 python_binary 以指定 platforms=范围。
    # src/python/ps_example/BUILD
    python_binary(name='ps_example',
    source = 'main.py',
    dependencies = [
    ':psutil', # defined in requirements.txt
    ],
    platforms=[
    'linux-x86_64',
    'macosx-10.7-x86_64',
    ],
    )

    # Defines targets from specifications in requirements.txt
    python_requirements()

    您还需要告诉裤子在哪里可以找到预构建的 python 包。编辑 pants.ini并添加:
    [python-repos]
    repos: [
    "%(buildroot)s/wheelhouse/"
    ]

    现在,复制文件 psutil-3.1.1-cp27-none-linux_x86_64.whl转到 mac 工作站并将其放在名为 wheelhouse/ 的目录中在你的 repo 的根目录下。

    完成此操作后,您现在可以构建多平台 pex
    mac $ ./pants binary src/python/py_example

    您可以通过解压缩来验证 pex 中是否包含 Mac 和 Linux 的库:
    mac $ unzip -l dist/ps_example.pex | grep psutil
    17290 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/DESCRIPTION.rst
    19671 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/METADATA
    1340 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-linux_x86_64.whl/psutil-3.1.1.dist-info/RECORD
    103 12-21-15 22:09
    ... .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/DESCRIPTION.rst
    19671 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/METADATA
    1338 12-21-15 22:09 .deps/psutil-3.1.1-cp27-none-macosx_10_11_intel.whl/psutil-3.1.1.dist-info/RECORD
    109 12-21-15 22:09
    ...

    关于裤子包括 OS X 特定的 Python 轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979100/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com