我正试图用pex打包我的本地模块,但似乎做不到。在
我创建了一个简单的项目:
→ python --version
Python 2.7.10
→ pex --version
pex 1.1.15
→ tree .
.
├── bla
│ ├── __init__.py
│ └── main.py
└── setup.py
bla/__init__.py
bla/main.py
if __name__ == '__main__':
print 'yo'
在我看来这是最简单的项目。在
→ pex -v . -o v.pex --disable-cache
Traceback (most recent call last):
File "/Users/Charly/repos/load_tester/venv/bin/pex", line 11, in <module>
sys.exit(main())
File "/Users/Charly/repos/load_tester/venv/lib/python2.7/site-packages/pex/bin/pex.py", line 540, in main
pex_builder = build_pex(reqs, options, resolver_options_builder)
File "/Users/Charly/repos/load_tester/venv/lib/python2.7/site-packages/pex/bin/pex.py", line 475, in build_pex
resolvables = [Resolvable.get(arg, resolver_option_builder) for arg in args]
File "/Users/Charly/repos/load_tester/venv/lib/python2.7/site-packages/pex/resolvable.py", line 61, in get
raise cls.InvalidRequirement('Unknown requirement type: %s' % resolvable_string)
pex.resolvable.InvalidRequirement: Unknown requirement type: .
也尝试执行python setup.py bdist_pex
,但失败了,因为找不到命令。在
我好像真的误解了一些基本的东西,但我不知道是什么。在
我发现了一些额外的细节。如果您运行:
它将尝试使用目录中的
setup.py
内部版本。如果没有,则pex
将失败。在默认情况下,
^{pr2}$pex
将缓存本地包输出,因此如果您更改了setup.py
,则使用该命令确保您的更改在下一次pex
运行时应用。在我最近与
pex
进行了一场斗争,试图让它包含本地模块。我学到的是:setup.py
文件,然后:这很难弄清楚,有几个原因。通过阅读文档,我可以推断在我的案例中正确的命令应该是这样的:
然而,当我试着这样做时,我总是得到一个错误,说:
^{pr2}$一个针对这个错误的web搜索出现在它的第一个命中-this Github issue,在我输入这个时它仍然是打开的。A花了很长时间认为上面的命令因为这个错误而无效。在this SO answer暗示有必要提供^{cd2>}文件之前,我试图降低setuptools的级别,并尝试“修复”这个问题。(Github的问题最终被证明是一个红鲱鱼。据我所知,它提到的
setuptools
错误已经被修复了。)所以。。。我写了一个
setup.py
文件。一开始,我一直收到这样一个错误,说Unknown requirement type: .
,但后来我意识到我的setup.py
只是包含了一个非常明显的排版错误。在本例中,pex发出的错误消息实际上非常清楚,但是后面是一个很大的ish堆栈跟踪和Unknown requirement type: .
消息。我只是没注意到,错过的时间比我愿意承认的要长。在我终于注意到了我的错别字并修复了它,但是我的
setup.py
中的另一个缺陷是未能包括我的本地模块。pex
在本例中起作用,但生成的文件没有:以下是最终对我有用的基本知识:
它以前不起作用的原因是我不小心将参数}(复数)。` \(ツ)´´
py_module
传递给setup()
,而不是{我遇到的最后一个障碍是在@cmcginty对这个问题的回答中提到的,即:除非您的模块版本号发生变化,
pex
将缓存/重用上次运行它时的工件。因此,如果您修复了setup.py
中的一个问题并重新运行pex
,那么它实际上不会合并您的更改,除非您:a)更改版本号,或者b)在调用pex
时通过disable-cache
。在最后,整个过程变成了一个练习,写一个合适的
setup.py
,然后运行:以下是我可以提供的一些建议(可能是给未来的我自己):
提示1
使用
python setup.py sdist
测试setup.py
文件。令人惊讶的是,这很容易搞砸,而且在您确定您的包中有正确的内容之前,没有必要涉及pex
。运行python setup.py sdist
之后,尝试将它生成的源包(位于dist
文件夹中)安装到一个新的venv中,并查看它是否包含您期望的所有文件。仅在之后继续调用pex
,这是有效的。在提示2
除非你有充分的理由不这样做,否则总是把
disable-cache
传给pex
。在提示3
在排除所有这些问题时,我发现我可以运行:
提取PEX文件的内容。这有助于解决sdist包内容与pex-ified应用程序之间的任何差异。在
一种方法是:
python setup.py sdist
创建源分发(tarball、zip文件等)然后用
-f DIST_DIR
开关运行pex
命令例如
pex $(pip freeze) -o aflaskapp.pex -e 'aflaskapp.app' -f dist -v
相关问题 更多 >
编程相关推荐