裤子包括 OS X 特定 Python 轮子
Pants includes OS X specific Python wheels
TLDR:裤子获取 OS X 特定轮子,因为我正在 Mac 上开发。我怎样才能避免这种情况,或者指定我将部署到 Ubuntu?
全文:
正在尝试使用 Pants 打包 Python 应用程序。到目前为止进展顺利,但是 运行 遇到了一个我已经被困了一段时间的问题。我在 macbook 上开发但部署到 EC2 Ubuntu.
这是我到目前为止所做的:
- 已创建 virtualenv。
- 向应用程序添加了 BUILD 文件,suggested 3rd party pattern 用于第三方包。
- 运行
./pants run.py backend:admin_server
运行 很好并生成了 dist/admin_server.pex
- 将 .pex 复制到新的 EC2 Ubuntu 盒子上。
然而,当我 运行 那里的应用程序时,我得到:
Failed to execute PEX file, missing compatible dependencies for:
mysql-python
pycrypto
问题似乎是 Pants 需要 OS X 个特定的轮子用于这些 2:
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
我怎样才能避免这种情况,或者指定他们应该 运行 在哪个 OS 上?
这是完整的输出:
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 文件,您必须首先为所有平台提供该库的 pre-built 版本,而不是您所在的平台 运行ning pants。
pre-build 库的最简单方法是使用 pip 工具构建轮子。
此食谱假设如下:
- 您想在 Linux 和 mac 上构建 multi-platform 到 运行 的 pex
您将要 pre-build 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
现在,要制作 multi-platform pex,您需要访问 Linux 框来创建 linux 版本的 psutil wheel。复制requirements.txt文件到linuxmachine,然后执行pip工具:
linux $ mkdir ~/src/cookbook/wheelhouse
linux $ pip wheel -r src/python/multi-platform/requirements.txt \
--wheel-dir=~/src/cookbook/wheelhouse
这将创建一个平台特定的 wheel 文件。
linux $ ls ~/src/cookbook/wheelhouse/
psutil-3.1.1-cp27-none-linux_x86_64.whl
现在,您需要将平台特定的 wheel 复制到要构建 multi-platform pex 的 machine(在这种情况下,您的 mac 笔记本电脑) .如果您定期使用此食谱,您可能需要配置一个 Python 存储库来存储您的 pre-built 库。
我们将使用与上面相同的 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()
您还需要告诉裤子在哪里可以找到 pre-built python 包。编辑 pants.ini
并添加:
[python-repos]
repos: [
"%(buildroot)s/wheelhouse/"
]
现在,将文件 psutil-3.1.1-cp27-none-linux_x86_64.whl
复制到 mac 工作站,并将其放在存储库根目录下名为 wheelhouse/
的目录中。
完成后,您现在可以使用
构建 multi-platform pex
mac $ ./pants binary src/python/py_example
您可以通过解压缩来验证 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
...
TLDR:裤子获取 OS X 特定轮子,因为我正在 Mac 上开发。我怎样才能避免这种情况,或者指定我将部署到 Ubuntu?
全文:
正在尝试使用 Pants 打包 Python 应用程序。到目前为止进展顺利,但是 运行 遇到了一个我已经被困了一段时间的问题。我在 macbook 上开发但部署到 EC2 Ubuntu.
这是我到目前为止所做的:
- 已创建 virtualenv。
- 向应用程序添加了 BUILD 文件,suggested 3rd party pattern 用于第三方包。
- 运行
./pants run.py backend:admin_server
运行 很好并生成了dist/admin_server.pex
- 将 .pex 复制到新的 EC2 Ubuntu 盒子上。
然而,当我 运行 那里的应用程序时,我得到:
Failed to execute PEX file, missing compatible dependencies for:
mysql-python
pycrypto
问题似乎是 Pants 需要 OS X 个特定的轮子用于这些 2:
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
我怎样才能避免这种情况,或者指定他们应该 运行 在哪个 OS 上?
这是完整的输出:
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 文件,您必须首先为所有平台提供该库的 pre-built 版本,而不是您所在的平台 运行ning pants。
pre-build 库的最简单方法是使用 pip 工具构建轮子。
此食谱假设如下:
- 您想在 Linux 和 mac 上构建 multi-platform 到 运行 的 pex 您将要 pre-build 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
现在,要制作 multi-platform pex,您需要访问 Linux 框来创建 linux 版本的 psutil wheel。复制requirements.txt文件到linuxmachine,然后执行pip工具:
linux $ mkdir ~/src/cookbook/wheelhouse
linux $ pip wheel -r src/python/multi-platform/requirements.txt \
--wheel-dir=~/src/cookbook/wheelhouse
这将创建一个平台特定的 wheel 文件。
linux $ ls ~/src/cookbook/wheelhouse/
psutil-3.1.1-cp27-none-linux_x86_64.whl
现在,您需要将平台特定的 wheel 复制到要构建 multi-platform pex 的 machine(在这种情况下,您的 mac 笔记本电脑) .如果您定期使用此食谱,您可能需要配置一个 Python 存储库来存储您的 pre-built 库。
我们将使用与上面相同的 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()
您还需要告诉裤子在哪里可以找到 pre-built python 包。编辑 pants.ini
并添加:
[python-repos]
repos: [
"%(buildroot)s/wheelhouse/"
]
现在,将文件 psutil-3.1.1-cp27-none-linux_x86_64.whl
复制到 mac 工作站,并将其放在存储库根目录下名为 wheelhouse/
的目录中。
完成后,您现在可以使用
构建 multi-platform pexmac $ ./pants binary src/python/py_example
您可以通过解压缩来验证 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
...