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

2023-11-24

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

完整故事:

尝试用 Pants 打包 Python 应用程序。到目前为止进展顺利,但遇到了一个困扰我一段时间的问题。我正在 macbook 上进行开发,但部署到 EC2 Ubuntu。

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

  1. 创建了虚拟环境。
  2. 将 BUILD 文件添加到应用程序中,其中建议的第 3 方模式对于第三方软件包。
  3. Ran ./pants run.py backend:admin_server运行良好并生成dist/admin_server.pex
  4. 将 .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 工具构建轮子。

本食谱假设如下:

  • 您想要构建一个在 Linux 和 mac 上运行的多平台 pex 您将在 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()

在同一目录中,在 requests.txt 文件中列出 python 库:

# src/python/ps_example/requirements.txt 
psutil==3.1.1

现在,要制作多平台 pex,您需要访问 Linux 盒子来创建 Linux 版本的 psutil Wheel。将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 存储库来存储预构建的库。

我们将使用与上面相同的 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()

您还需要告诉 Pants 在哪里可以找到预构建的 Python 包。编辑pants.ini并添加:

[python-repos]
repos: [
    "%(buildroot)s/wheelhouse/"
  ]

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

完成此操作后,您现在可以使用以下命令构建多平台 pex:

mac $ ./pants binary src/python/py_example

您可以通过解压缩 pex 来验证 Mac 和 Linux 的库是否包含在 pex 中:

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   
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

裤子包括 OS X 特定的 Python 轮子 的相关文章

  • 如何从 Azure Blob 存储查看图像而不是下载图像?

    好的 我正在使用 Node js 和 Azure Blob 存储来处理一些文件上传 当一个人上传图像时 我想向他们显示图像的缩略图 上传效果很好 我将其存储在我的 blob 中 我使用了这个很好的链接 使用 Azure SDK for No
  • 未经许可的地理定位[重复]

    这个问题在这里已经有答案了 我注意到现代基于 html5 的地理定位总是询问用户 您想与此网站共享您的位置吗 这很好 但我知道还有其他途径可以尝试确定大致的地理位置 而无需请求此许可 如果我记得的话 这些服务使用 IP 数据库来尝试跟踪地理
  • 我可以将 socket.io 事件侦听器分离到不同的模块中吗?

    我正在处理超过 15 个不同的套接字事件 我想在与这些事件相关的模块中管理某些 socket io 事件 例如 我想让一个名为 login js 的文件处理login套接字事件 名为 register js 的文件处理注册套接字事件 索引
  • 根据 Django 管理中的父模型预填充内联

    我有两个模型 Event and Series 其中每个事件都属于一个系列 大多数时候 一个事件start time与其系列相同default time 这是模型的精简版本 models py class Series models Mod
  • 有哪些好的 WCF/Web 服务安全读物? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 最近 我做了很多与 WCF Web 服务和分布式计算相关的学习和工作 但大多数安全概念都超出了我的理解范围 传输安全 消息安全 加密 证书等 我了解
  • Arraylists 的 Arraylist 的通用类型

    在正常的数组列表初始化中 我们过去定义泛型类型如下 List
  • 使用 Laravel 从 Web 服务器流式传输 Amazon S3 对象

    在我使用 laravel 5 1 构建的 Web 应用程序中 用户可以上传我存储在 Amazon S3 中的一些敏感文件 后来我想要用户经许可下载此文件 由于我希望进行此身份验证检查 因此我无法使用传统方法通过直接链接到 S3 中的文件来下
  • jQuery 从文本区域转义 HTML

    我想将 HTML 标签转义为实体名称 从textarea并将结果放入第二个textarea这样
  • 如何设置 selenium 3.0,在 c# 中出现错误“The geckodriver.exe 文件不存在...”

    将 Visual Studio 中的 selenium 更新为 3 0 将 Firefox 更新为 47 0 现在当我尝试使用本地 Webdriver 模式时收到此错误 当前目录或 PATH 环境变量上的目录中不存在 geckodriver
  • 使用同一 Visual Studio 2005 解决方案的不同版本/分支

    这是使用 VS2005 的可用性问题 我有从版本控制中签出的同一个 Visual Studio 2005 解决方案的不同分支 解决方案和项目文件也受到版本控制 在我的开发工作站上 有时我会在不同版本或分支上打开多个 Visual Studi
  • 打破嵌套循环和主循环[重复]

    这个问题在这里已经有答案了 我有以下代码 int x 100 Or some other value while x gt 0 for int i 5 i gt 0 i x x 2 if x 0 break 然而 这只会破坏 for 循环
  • Windows 的 Curses 替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 python 有没有可以在 Windows 中使用curses 模块的替代方案 我查了一下 python 文档 但其中提到它可以在 unix 中使用
  • ExecutorService 的 shutdown() 不会等到所有线程都完成

    我有一个代码 其中 4 个线程同时运行 我想等到这 4 个线程全部完成 只有在那之后才能继续应用程序流程 我尝试了两种方法 Thread join 此方法按预期工作 后面的代码join 仅在所有线程完成后才执行 ExecutorServic
  • Laravel htaccess 问题

    我正在尝试建立一个网站 该网站在实时开发服务器上运行得非常好 我们一直用该服务器向客户端展示该网站 这是来自实时开发的 htaccess 工作正常
  • 覆盖 Android 上的物理菜单按钮

    我希望 Android 设备上的菜单键打开一个对话框 而不是在我的应用程序运行时打开菜单 我尝试将其编码为onCreateOptionsMenu Menu menu 但它只在我第一次按下菜单按钮时起作用 我可以用其他方式来做吗 您可以通过在
  • 如何使用 Ncurses 打印 (☞゚ヮ゚)☞?

    我想在 Ubuntu 中使用 C 使用 Ncurses 库打印 首先 您只需拥有以下内容即可做到这一点 std cout lt lt lt lt std endl 而且效果很好 但是 当使用 Ncurses 打印时 我认为您需要使用prin
  • 停止 Jetpack Compose pointInteropFilter 消耗输入事件

    我有一个垂直的Column有两个孩子 A Pager可组合 来自伴奏者 显示Text A Canvas绘制两个圆弧和一个圆的可组合项 它们的排序顺序与此处描述的顺序相同 我想要Text始终渲染在Canvas 实施细节 The Canvas可
  • 不同CG/GLSL/HLSL功能的性能

    有着色器函数的标准库 例如 forCg 但是是否有资源可以告诉您每个操作需要多长时间 我的想法类似于您过去如何查找每个 ASM 操作需要多少个周期 没有reliable资源将告诉您各种标准着色器函数需要多长时间 即使对于特定的硬件也是如此
  • 捆绑包无效 - Info.plist 中的 CFBundleVersion 和 CFBundleShortVersionString 必须包含更高版本 - 但它们确实包含

    在尝试验证我的应用程序以准备提交到应用程序商店时 我收到以下错误 但这是我的 Info plist 的屏幕截图 错误消息声称列表版本为 1 0 但显示版本为 1 4 我做错了什么 我该如何解决这个问题 Apple 考虑每个版本级别 sepa

随机推荐

  • 加载数据时浏览器忙指示器

    我正在努力实现已经解释过的目标here 我正在尝试使用动态脚本标签将一些数据从服务器加载到客户端 即我创建一个脚本标签 将其 src 设置为我的 JSON 控制器并将其附加到我的 head 或 body 标签 脚本正确加载从服务器返回的数据
  • 如何检查安装的 OpenSSL 版本是否 >= 0.9.8k

    我有一个 PHP 5 x 脚本 需要 OpenSSL 0 9 8k 或更高版本 关于OpenSSL 我发现了以下两个相关常量 OPENSSL VERSION TEXT with value OpenSSL 1 0 0c 2 Dec 2010
  • 以编程方式启用高精度或省电定位模式,无需用户访问“设置”

    为什么我问这个 也是在应用程序中尝试它的原因 它发生了当我们使用谷歌地图棒棒糖 即使位置被禁用 用户从地图应用程序输入后 它也会以高精度模式打开 而无需访问 设置 启用蓝牙可以实现类似的功能 该操作是在我的应用程序中启动的 用户需要做出选择
  • HTML5 本地存储与会话存储

    除了非持久性和仅限于当前窗口之外 会话存储相对于本地存储还有什么好处 性能 数据访问等 吗 本地存储 and 会话存储两者都延伸Storage 除了预期的 非持久性 之外 它们之间没有任何区别sessionStorage 也就是说 数据存储
  • 接收远程服务器返回错误:(403) 禁止消息

    我在下面的代码块上收到 远程服务器返回错误 403 Forbidden 错误消息 具体来说 这一行失败了 var 响应 HttpWebResponse request GetResponse 该代码在我的开发机器上完美运行 但在生产中却无法
  • 将 DBRef 解析为 Json

    我在 MongoDB 的规范化数据模型结构中收到以下错误 org bson codecs configuration CodecConfigurationException Can t find a codec for class com
  • 从任何函数中提取函数参数和默认值

    有没有办法从任何给定函数中提取参数及其各自的默认值outside功能 例如 给定 myfunc lt function a b 1 print c a b 我正在寻找一些会返回的函数 list a NULL b 1 或其一些变体 您正在寻找
  • 指定分页页面 - Laravel 4

    我试图 记住 用户浏览记录时所在的页面 以便当他返回列表时 他会返回到他离开的页面 如何更改分页器的 当前页面 值 我尝试过 Input set page x 但没有这样的功能 GET 页面 x 也不起作用 这是代码 list Public
  • 将独立图例合并到 ggpairs 中(采取 2)

    tl dr无法获得独立的图例 描述整个绘图中的常见颜色 ggpairs令我满意 抱歉长度 我正在尝试使用绘制 下三角 对图GGally ggpairs 用于绘制各种绘图矩阵的扩展包ggplot2 这本质上是同一个问题如何向 ggpairs
  • Django Rest Framework:使用令牌身份验证时重定向到 Amazon S3 失败

    我在 DRF 中使用令牌身份验证 并且对于某个 API 调用 想要重定向到 S3 使用类似的 URLhttps my bucket s3 amazonaws com my file path my file jpg Signature MY
  • AttributeError:“池”对象没有属性“__exit__”

    我正在使用一些多处理Python脚本multiprocessing Pool 这些脚本如下所示 from multiprocessing import Pool def f x return x x if name main with Po
  • 我什么时候应该在菜单项中使用省略号

    我什么时候应该把 放在菜单项的末尾 我似乎记得读过一些规则 但我一辈子都找不到它们 对于上下文 我正在向右键单击菜单添加属性选项 并且想知道添加它们是否合适 据我了解 这表明该选项在实际执行任何操作之前会询问您其他问题 这 3 个点实际上称
  • Sql Server 2005 - 如果不存在则插入

    互联网上有很多关于这个常见 问题 的信息 解决方案如 IF NOT EXISTS BEGIN INSERT INTO END 在我看来 它们不是线程安全的 您可能会同意 但是你能确认将exists放入单选的where子句中就可以解决sql引
  • 如何从 App Store 上提供的 ipa 文件获取 dSYM 文件

    有没有办法从 App Store 中提供的 ipa 文件获取 dSYM 文件 我丢失了特别包含 dSYM 的档案 我可以这样做吗 我需要将 dSYM 上传到 Crittercism 提前致谢 假设您仍然可以访问 iTunes Connect
  • C# SIP 堆栈/库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个好的 SIP 库 要么用 C 编写 要么提供 C 包装器 不一定需要免费 有人用过什么好东西吗 为了澄清起见 我说的是 VoIP 协议
  • 创建具有动态属性名称的对象[重复]

    这个问题在这里已经有答案了 我正在尝试这样做 var KEYS KEYS PHONE TYPE phone type KEYS AGENT TYPE agent type var myAppConfig iconMap KEYS PHONE
  • SQLAlchemy with_for_update 行锁定不起作用?

    有一个学生 他的type属性为 4 最小值为type属性可以是1 在 postgres 中 在会话 1 中 我独占锁定并更新学生表中的一行 BEGIN LOCK TABLE students IN ROW EXCLUSIVE MODE SE
  • 直接在SQLite中计算两点之间的距离

    在我的 web MySQL 应用程序中 我有类似的方法来获取两点之间的距离 6371 acos cos radians 19 83996 cos radians lat cos radians 43 94910 radians lng si
  • 如何从 preg_split 结果中删除空数组? [复制]

    这个问题在这里已经有答案了 举个例子 我有大量的正则表达式 就像我写的一样简单 php gt var dump preg split reg s reg a zA Z array 3 0 gt string 0 1 gt string 13
  • 裤子包括 OS X 特定的 Python 轮子

    TLDR Pants 获取 OS X 特定的轮子 因为我正在 Mac 上开发 我怎样才能避免这种情况 或者指定我将部署到 Ubuntu 完整故事 尝试用 Pants 打包 Python 应用程序 到目前为止进展顺利 但遇到了一个困扰我一段时