如何将所有python代码捆绑到一个zip文件中?
分发应用程序时,将 所有
鸡蛋合并到一个zip文件中会很方便,这样您只需分发一个zip文件和一个可执行文件即可(某些自定义二进制文件会简单地启动,加载zip文件的主要功能并启动python关闭或类似)。
我已经看到过一些有关在线执行此操作的讨论,但是没有实际执行此操作的示例。
我知道您可以(如果它是zip安全的)将鸡蛋转换为zip文件。
我不确定的是:
您能以某种方式将所有鸡蛋合并到一个zip文件中吗?如果是这样,怎么办?
您如何从特定的鸡蛋加载并运行代码?
您将如何确保该Egg中的代码可以访问所有依赖项(即zip文件中的其他Egg)?
人们经常问这类问题,并得到类似的答案。使用py2exe。是的,我明白了,这是一种解决方案。不过这不是我要问的问题…
-
您可以使用常规python工具自动执行大部分工作。让我们从干净的virtualenv开始。
[zart@feena ~]$ mkdir ziplib-demo [zart@feena ~]$ cd ziplib-demo [zart@feena ziplib-demo]$ virtualenv . New python executable in ./bin/python Installing setuptools.............done. Installing pip...............done.
现在,让我们安装将进入压缩库的一组软件包。诀窍是强制将它们安装到特定目录中。
(注意:不要在命令行或pip.conf / pip.ini中使用–egg选项,因为它会破坏文件布局,从而使其无法在zip中导入)
[zart@feena ziplib-demo]$ bin/pip install --install-option --install-lib=$PWD/unpacked waitress Downloading/unpacking waitress Downloading waitress-0.8.5.tar.gz (112kB): 112kB downloaded Running setup.py egg_info for package waitress Requirement already satisfied (use --upgrade to upgrade): setuptools in ./lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg (from waitress) Installing collected packages: waitress Running setup.py install for waitress Installing waitress-serve script to /home/zart/ziplib-demo/bin Successfully installed waitress Cleaning up...
更新 :现在pip有了
-t <path>
switch,其功能与相同--install-option --install-lib=
。现在让我们将它们打包成一个拉链
[zart@feena ziplib-demo]$ cd unpacked [zart@feena unpacked]$ ls waitress waitress-0.8.5-py2.7.egg-info [zart@feena unpacked]$ zip -r9 ../library.zip * adding: waitress/ (stored 0%) adding: waitress/receiver.py (deflated 71%) adding: waitress/server.pyc (deflated 64%) adding: waitress/utilities.py (deflated 62%) adding: waitress/trigger.pyc (deflated 63%) adding: waitress/trigger.py (deflated 61%) adding: waitress/receiver.pyc (deflated 60%) adding: waitress/adjustments.pyc (deflated 51%) adding: waitress/compat.pyc (deflated 56%) adding: waitress/adjustments.py (deflated 60%) adding: waitress/server.py (deflated 68%) adding: waitress/channel.py (deflated 72%) adding: waitress/task.pyc (deflated 57%) adding: waitress/tests/ (stored 0%) adding: waitress/tests/test_regression.py (deflated 63%) adding: waitress/tests/test_functional.py (deflated 88%) adding: waitress/tests/test_parser.pyc (deflated 76%) adding: waitress/tests/test_trigger.pyc (deflated 73%) adding: waitress/tests/test_init.py (deflated 72%) adding: waitress/tests/test_utilities.pyc (deflated 78%) adding: waitress/tests/test_buffers.pyc (deflated 79%) adding: waitress/tests/test_trigger.py (deflated 82%) adding: waitress/tests/test_buffers.py (deflated 86%) adding: waitress/tests/test_runner.py (deflated 75%) adding: waitress/tests/test_init.pyc (deflated 69%) adding: waitress/tests/__init__.pyc (deflated 21%) adding: waitress/tests/support.pyc (deflated 48%) adding: waitress/tests/test_utilities.py (deflated 73%) adding: waitress/tests/test_channel.py (deflated 87%) adding: waitress/tests/test_task.py (deflated 87%) adding: waitress/tests/test_functional.pyc (deflated 82%) adding: waitress/tests/__init__.py (deflated 5%) adding: waitress/tests/test_compat.pyc (deflated 53%) adding: waitress/tests/test_receiver.pyc (deflated 79%) adding: waitress/tests/test_adjustments.py (deflated 78%) adding: waitress/tests/test_adjustments.pyc (deflated 74%) adding: waitress/tests/test_server.pyc (deflated 73%) adding: waitress/tests/fixtureapps/ (stored 0%) adding: waitress/tests/fixtureapps/filewrapper.pyc (deflated 59%) adding: waitress/tests/fixtureapps/getline.py (deflated 37%) adding: waitress/tests/fixtureapps/nocl.py (deflated 47%) adding: waitress/tests/fixtureapps/sleepy.pyc (deflated 44%) adding: waitress/tests/fixtureapps/echo.py (deflated 40%) adding: waitress/tests/fixtureapps/error.py (deflated 52%) adding: waitress/tests/fixtureapps/nocl.pyc (deflated 48%) adding: waitress/tests/fixtureapps/getline.pyc (deflated 32%) adding: waitress/tests/fixtureapps/writecb.pyc (deflated 42%) adding: waitress/tests/fixtureapps/toolarge.py (deflated 37%) adding: waitress/tests/fixtureapps/__init__.pyc (deflated 20%) adding: waitress/tests/fixtureapps/writecb.py (deflated 50%) adding: waitress/tests/fixtureapps/badcl.pyc (deflated 44%) adding: waitress/tests/fixtureapps/runner.pyc (deflated 58%) adding: waitress/tests/fixtureapps/__init__.py (stored 0%) adding: waitress/tests/fixtureapps/filewrapper.py (deflated 74%) adding: waitress/tests/fixtureapps/runner.py (deflated 41%) adding: waitress/tests/fixtureapps/echo.pyc (deflated 42%) adding: waitress/tests/fixtureapps/groundhog1.jpg (deflated 24%) adding: waitress/tests/fixtureapps/error.pyc (deflated 48%) adding: waitress/tests/fixtureapps/sleepy.py (deflated 42%) adding: waitress/tests/fixtureapps/toolarge.pyc (deflated 43%) adding: waitress/tests/fixtureapps/badcl.py (deflated 45%) adding: waitress/tests/support.py (deflated 52%) adding: waitress/tests/test_task.pyc (deflated 78%) adding: waitress/tests/test_channel.pyc (deflated 78%) adding: waitress/tests/test_regression.pyc (deflated 68%) adding: waitress/tests/test_parser.py (deflated 80%) adding: waitress/tests/test_server.py (deflated 78%) adding: waitress/tests/test_receiver.py (deflated 87%) adding: waitress/tests/test_compat.py (deflated 51%) adding: waitress/tests/test_runner.pyc (deflated 72%) adding: waitress/__init__.pyc (deflated 50%) adding: waitress/channel.pyc (deflated 58%) adding: waitress/runner.pyc (deflated 54%) adding: waitress/buffers.py (deflated 74%) adding: waitress/__init__.py (deflated 61%) adding: waitress/runner.py (deflated 58%) adding: waitress/parser.py (deflated 69%) adding: waitress/compat.py (deflated 69%) adding: waitress/buffers.pyc (deflated 69%) adding: waitress/utilities.pyc (deflated 60%) adding: waitress/parser.pyc (deflated 53%) adding: waitress/task.py (deflated 72%) adding: waitress-0.8.5-py2.7.egg-info/ (stored 0%) adding: waitress-0.8.5-py2.7.egg-info/dependency_links.txt (stored 0%) adding: waitress-0.8.5-py2.7.egg-info/installed-files.txt (deflated 83%) adding: waitress-0.8.5-py2.7.egg-info/top_level.txt (stored 0%) adding: waitress-0.8.5-py2.7.egg-info/PKG-INFO (deflated 65%) adding: waitress-0.8.5-py2.7.egg-info/not-zip-safe (stored 0%) adding: waitress-0.8.5-py2.7.egg-info/SOURCES.txt (deflated 71%) adding: waitress-0.8.5-py2.7.egg-info/entry_points.txt (deflated 33%) adding: waitress-0.8.5-py2.7.egg-info/requires.txt (deflated 5%) [zart@feena unpacked]$ cd ..
请注意,这些文件应位于zip文件的顶部,
zip -r9 library.zip unpacked
检查结果:
[zart@feena ziplib-demo]$ PYTHONPATH=library.zip python Python 2.7.1 (r271:86832, Apr 12 2011, 16:15:16) [GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import waitress >>> waitress <module 'waitress' from '/home/zart/ziplib-demo/library.zip/waitress/__init__.pyc'> >>> >>> from wsgiref.simple_server import demo_app >>> waitress.serve(demo_app) serving on http://0.0.0.0:8080 ^C>>>
更新: 从python
3.5开始,还有zipapp模块可以帮助将整个包捆绑到.pyz文件中。对于更复杂的需求,pyinstaller,py2exe或py2app可能更合适。