我最近在pex
尝试让它包含本地模块时遇到了一些困难。我学到的是:
- 您必须为您的模块提供有效的
setup.py
文件才能使其正常工作,并且:
- 您必须指定应用程序的入口点
由于几个原因,这很难弄清楚。通过阅读文档,我能够推断出在我的案例中正确的命令应该是这样的:
$ pex . -v -e usersnotifier:main -o usersnotifier.pex
但是,当我尝试这个时,我不断收到错误消息:
pex.resolvable.InvalidRequirement: Unknown requirement type: .
出现了对这个错误的网络搜索——作为它的第一个命中——<a href="https://github.com/pantsbuild/pex/issues/360" rel="noreferrer">这个 Github 问题,它仍然以我打这个。由于这个错误,A 花了很长时间认为上述命令不起作用。在此 SO 答案暗示有必要提供setup.py
文件之前,我尝试降级 setuptools 并进行了六次其他徒劳的尝试来“解决”问题。(那个 Github 问题原来是一个红鲱鱼。setuptools
它提到的错误已经被修复,据我所知。)
所以...我写了一个setup.py
文件。起初,我一直在说那个错误,Unknown requirement type: .
但后来我意识到我setup.py
只是包含一个非常明显的印刷错误。在这种情况下,pex 发出的错误消息实际上很清楚,但后面跟着一个大的堆栈跟踪和Unknown requirement type: .
消息。我只是没有密切关注,错过的时间比我愿意承认的要长。
我终于注意到我的错字并修复了它,但我的另一个缺陷setup.py
是未能包含我的本地模块。pex
在这种情况下工作,但生成的文件没有:
$ pex . -v -e usersnotifier:main -o usersnotifier.pex --disable-cache
usersnotifier 0.1: Resolving distributions :: Packaging paho-mqtt
pyinotify 0.9.6
paho-mqtt 1.3.1
pex: Building pex: 2704.3ms
pex: Resolving distributions: 2393.2ms
pex: Packaging usersnotifier: 319.3ms
pex: Packaging pyinotify: 347.4ms
pex: Packaging paho-mqtt: 361.1ms
Saving PEX file to usersnotifier.pex
$ ./usersnotifier.pex
Traceback (most recent call last):
File ".bootstrap/_pex/pex.py", line 367, in execute
File ".bootstrap/_pex/pex.py", line 293, in _wrap_coverage
File ".bootstrap/_pex/pex.py", line 325, in _wrap_profiling
File ".bootstrap/_pex/pex.py", line 410, in _execute
File ".bootstrap/_pex/pex.py", line 468, in execute_entry
File ".bootstrap/_pex/pex.py", line 482, in execute_pkg_resources
File ".bootstrap/pkg_resources/__init__.py", line 2297, in resolve
ImportError: No module named 'usersnotifier'
setup.py
这是最终为我工作的准系统:
from setuptools import setup
setup(
name='usersnotifier',
version='0.1',
py_modules=['usersnotifier', 'userswatcher'],
install_requires=[
'paho-mqtt>=1.3.1',
'pyinotify>=0.9.6',
],
include_package_data=True,
zip_safe=False
)
它以前不起作用的原因是我不小心将参数传递py_module
给setup()
而不是py_modules
(复数)。¯\_(ツ)_/¯
@cmcginty 对这个问题的回答中提到了我遇到的最后一个障碍,即:除非您的模块版本号发生更改,pex
否则将缓存/重用您上次运行它的工件。因此,如果您修复了您的问题setup.py
并重新运行pex
,它实际上不会合并您的更改,除非您:a)增加版本号,或 b)--disable-cache
在调用pex
.
在一天结束时,整个事情变成了编写正确的练习setup.py
,并运行:
$ pex . -v -e mymodule:main -o mymodule.pex --disable-cache
以下是我可以提供的一些提示(可能是我未来的版本):
提示 1
用于python setup.py sdist
测试您的setup.py
文件。搞砸这件事出奇地容易,在你确定你的包裹有正确的内容之前,没有任何意义pex
。运行后python setup.py sdist
,尝试将它生成的源包(位于dist
文件夹中)安装到一个新的 venv 中,看看它是否包含您期望的所有文件。只有在这工作pex
之后才继续调用。
提示 2
除非您有充分的理由不这样做,否则请始终传递--disable-cache
给。pex
提示 3
在对所有这些问题进行故障排除时,我发现我可以运行:
$ unzip mymodule.pex
提取 PEX 文件的内容。这有助于解决 sdist 包内容和 pex 化应用程序之间存在的任何差异。