10

我正在尝试创建一个简单的 3 页烧瓶网站的 PEX 文件。该网站在 python3 上与 Gunicorn 一起使用,客户希望将该网站编译为一个封装pex文件。

pex -r zb1/requirements.txt -e zb1/run -o zb1.pex

也试过

pex -r zb1/requirements.txt -m zb1:run -o zb1.pex

当我运行该命令时,它编译得很好,但问题是当我尝试运行 pex 文件时。

c:~ c$ ./zb1.pex 
Traceback (most recent call last):
  File ".bootstrap/_pex/pex.py", line 326, in execute
  File ".bootstrap/_pex/pex.py", line 258, in _wrap_coverage
  File ".bootstrap/_pex/pex.py", line 290, in _wrap_profiling
  File ".bootstrap/_pex/pex.py", line 369, in _execute
  File ".bootstrap/_pex/pex.py", line 427, in execute_entry
  File ".bootstrap/_pex/pex.py", line 432, in execute_module
  File "/usr/local/Cellar/python3/3.5.2/Frameworks/Python.framework/Versions/3.5/lib/python3.5/runpy.py", line 192, in run_module
    mod_name, mod_spec, code = _get_module_details(mod_name)
  File "/usr/local/Cellar/python3/3.5.2/Frameworks/Python.framework/Versions/3.5/lib/python3.5/runpy.py", line 127, in _get_module_details
    raise error("No module named %s" % mod_name)
ImportError: No module named zb1/run

我尝试了不同的pex命令变体。这是在带有 python2.7 和 python3.5 的 MacOSX El Capitan 上

提前感谢您,如果您需要任何额外信息,请告诉我。

项目结构

zb1
├── README.md
├── __init__.py
├── application
│   ├── config.py
│   ├── static
│   ├── templates
│   ├── uploads
│   ├── utilities
│   └── zbo
├── buildup.py
├── env
├── requirements.txt
├── run.py  << ENTRY POINT!
└── setup.sh
4

1 回答 1

3

您正在运行的命令仅包括项目的要求,它们实际上并不指示 Pex 包含您的代码。要将您的代码放入 Pex 可执行文件中,您需要先将其打包,然后指示 Pex 包含该包。

(无论出于何种原因,Pex 不喜欢这个名字zb1,所以我mypackage改用了)

1.打包你的代码:

setup.py在顶层创建一个文件:

#!/usr/bin/env python

from setuptools import setup

setup(
    name='mypackage',
    packages = ['mypackage'],
    version='1.0.0')

将您的代码移动到与您的包同名的子目录:

mypackage
├── mypackage
│   ├── __init__.py
│   ├──application
│   │  ├── config.py
│   │  ├── static
│   │  ├── templates
│   │  ├── uploads
│   │  ├── utilities
│   │  └── zbo
│   ├── buildup.py
│   └── run.py
├── env
├── requirements.txt
├── setup.py
└── setup.sh

创建一个轮子文件

pip3 wheel -w . .

这将创建一个文件,其中包含您的所有代码mypackage-1.0.0-py3-none-any.whl

2. 运行 Pex,包括你的包:

pex --python=python3 -r requirements.txt -f . mypackage -e mypackage.run -o mypackage.pex

请注意,可执行文件是使用包和模块之间的点来指定的。

于 2017-11-26T00:09:57.267 回答