2012-11-15 1 views
4

От чтения this documentation, я создал ментальную модель того, что на самом деле делает команда sh setuptools-0.6c11-py2.7.egg, но она очень неполная, и я все еще озадачен несколькими аспектами.Когда я запускаю setuptools .egg «как если бы это был скрипт оболочки», что на самом деле происходит?

Моя ментальная модель выходит что-то вроде этого:

  1. Когда эта команда выдается, яйцо (которое я рассматривать как своего рода почтовый файл, который обрабатывает зависимости хитро) каким-то образом находит правильную версию питона в моей системе и используя этот python, «устанавливает себя» в соответствующее место.
  2. На практике это означает, что «Unix Executable File», называемый easy_install, создается в каталоге, который, надеюсь, на моем пути. Вот почему я могу просто ввести easy_install somepackage в терминал.

Мои вопросы таким образом:

  1. Как это «яйцо» в состоянии «установить себя» таким образом? Почему это работает для этого яйца, в частности, когда другие яйца требуют easy_install для работы?
  2. Созданный таким образом «исполняемый файл Unix» составляет 4kb. Что на самом деле? Полон ли он звонков на другие вещи? Где они?

Это не вопрос, как его заставить работать. У меня нет проблем вдоль этой оси, но я хотел бы полностью понять, что здесь происходит.

ответ

8

Файлы-яйца - это просто zip-сжатые каталоги, содержащие пакеты Python, модули и небольшие метаданные с расширением .egg.

Формат zip является гибким; он будет игнорировать что-либо в начале файла, что не является частью zipfile. Zip-файл обнаруживается путем нахождения ряда символов (PK и еще двух байтов, указывающих тип) и чтения оттуда.

Это означает, что вы можете положить что-то спереди почтового индекса. В setuptools яйца особенного в том, что они используют этот трюк, чтобы вставить какой-то скрипт перед зип данных:

$ head -n8 setuptools-0.6c11-py2.7.egg 
#!/bin/sh 
if [ `basename $0` = "setuptools-0.6c11-py2.7.egg" ] 
then exec python2.7 -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from setuptools.command.easy_install import bootstrap; sys.exit(bootstrap())" "[email protected]" 
else 
    echo $0 is not the correct name for this egg file. 
    echo Please rename it back to setuptools-0.6c11-py2.7.egg and try again. 
    exec false 
fi 

Past те первые 8 строк, это настоящая молния:

$ tail -n+9 setuptools-0.6c11-py2.7.egg | file - 
/dev/stdin: Zip archive data, at least v2.0 to extract 

Скрипт, содержащийся в эти первые 8 строк - это то, что выполняется при запуске sh setuptools-0.6c11-py2.7.egg.

Как вы можете видеть, сценарий специфичен для версии яйца; это в версии для python 2.7, и он просто использует интерпретатор python, чтобы добавить это яйцо в путь поиска python. Затем он импортирует функцию из содержащегося модуля python и запускает ее.

Вот содержимое самого яйца, что, как я уже говорил только архив zip:

$ zipinfo -l setuptools-0.6c11-py2.7.egg 
Archive: setuptools-0.6c11-py2.7.egg 332005 bytes 78 files 
-rw-rw-r-- 2.0 unx  1713 b-  995 defN 7-Jul-10 20:26 site.pyc 
-rw-rw-r-- 2.0 unx 90113 b- 31461 defN 7-Jul-10 20:26 pkg_resources.pyc 
-rw-rw-r-- 2.0 unx 85435 b- 23537 defN 19-Oct-09 13:35 pkg_resources.py 
-rw-rw-r-- 2.0 unx  2362 b-  875 defN 20-Sep-06 17:05 site.py 
-rw-rw-r-- 2.0 unx  309 b-  224 defN 7-Jul-10 20:26 easy_install.pyc 
-rw-rw-r-- 2.0 unx  126 b-  105 defN 20-Sep-06 17:05 easy_install.py 
-rw-rw-r-- 2.0 unx  43 b-  43 defN 7-Jul-10 20:26 EGG-INFO/top_level.txt 
-rw-rw-r-- 2.0 unx  1591 b-  458 defN 7-Jul-10 20:26 EGG-INFO/SOURCES.txt 
-rw-rw-r-- 2.0 unx  1 b-  3 defN 20-Oct-09 10:07 EGG-INFO/zip-safe 
-rw-rw-r-- 2.0 unx  9278 b-  3194 defN 7-Jul-10 20:26 EGG-INFO/PKG-INFO 
-rwxrwxr-x 2.0 unx  2504 b-  623 defN 7-Jul-10 20:26 EGG-INFO/entry_points.txt 
-rw-rw-r-- 2.0 unx  1 b-  3 defN 7-Jul-10 20:26 EGG-INFO/dependency_links.txt 
-rw-rw-r-- 2.0 unx  1567 b-  791 defN 7-Jul-10 20:26 setuptools/extension.pyc 
-rw-rw-r-- 2.0 unx  1089 b-  424 defN 20-Sep-06 17:05 setuptools/extension.py 
-rw-rw-r-- 2.0 unx 10796 b-  4050 defN 7-Jul-10 20:26 setuptools/sandbox.pyc 
-rw-rw-r-- 2.0 unx  8227 b-  2309 defN 6-Jul-10 20:09 setuptools/sandbox.py 
-rw-rw-r-- 2.0 unx  5677 b-  2499 defN 7-Jul-10 20:26 setuptools/archive_util.pyc 
-rw-rw-r-- 2.0 unx 26800 b- 11228 defN 7-Jul-10 20:26 setuptools/package_index.pyc 
-rw-rw-r-- 2.0 unx  6209 b-  2229 defN 19-Oct-09 13:35 setuptools/depends.py 
-rw-rw-r-- 2.0 unx  6677 b-  3096 defN 7-Jul-10 20:26 setuptools/depends.pyc 
-rw-rw-r-- 2.0 unx  2816 b-  1159 defN 6-Jul-10 20:09 setuptools/__init__.py 
-rw-rw-r-- 2.0 unx  3639 b-  1837 defN 7-Jul-10 20:26 setuptools/__init__.pyc 
-rw-rw-r-- 2.0 unx  5924 b-  1777 defN 19-Oct-09 13:35 setuptools/archive_util.py 
-rw-rw-r-- 2.0 unx 29972 b-  8156 defN 19-Oct-09 13:35 setuptools/dist.py 
-rwxrwxr-x 2.0 unx  7168 b-  3249 defN 19-Oct-09 17:18 setuptools/cli.exe 
-rw-rw-r-- 2.0 unx 28275 b-  8698 defN 6-Jul-10 20:09 setuptools/package_index.py 
-rw-rw-r-- 2.0 unx 29786 b- 10953 defN 7-Jul-10 20:26 setuptools/dist.pyc 
-rwxrwxr-x 2.0 unx  7168 b-  3244 defN 19-Oct-09 17:18 setuptools/gui.exe 
-rw-rw-r-- 2.0 unx 22219 b-  7042 defN 7-Jul-10 20:26 setuptools/tests/test_resources.pyc 
-rw-rw-r-- 2.0 unx 19388 b-  4723 defN 24-Sep-08 13:10 setuptools/tests/test_resources.py 
-rw-rw-r-- 2.0 unx 12345 b-  2765 defN 24-Sep-08 13:10 setuptools/tests/__init__.py 
-rw-rw-r-- 2.0 unx 13811 b-  4523 defN 7-Jul-10 20:26 setuptools/tests/__init__.pyc 
-rw-rw-r-- 2.0 unx  1499 b-  708 defN 7-Jul-10 20:26 setuptools/tests/test_packageindex.pyc 
-rw-rw-r-- 2.0 unx 81351 b- 27171 defN 7-Jul-10 20:26 setuptools/tests/doctest.pyc 
-rw-rw-r-- 2.0 unx  759 b-  346 defN 24-Sep-08 13:10 setuptools/tests/test_packageindex.py 
-rw-rw-r-- 2.0 unx 99714 b- 25663 defN 20-Sep-06 17:05 setuptools/tests/doctest.py 
-rw-rw-r-- 2.0 unx  2866 b-  1332 defN 7-Jul-10 20:26 setuptools/command/rotate.pyc 
-rw-rw-r-- 2.0 unx 11520 b-  3127 defN 19-Oct-09 13:35 setuptools/command/build_ext.py 
-rw-rw-r-- 2.0 unx  6649 b-  2208 defN 24-Sep-08 13:10 setuptools/command/upload.py 
-rw-rw-r-- 2.0 unx  8162 b-  3538 defN 7-Jul-10 20:26 setuptools/command/sdist.pyc 
-rw-rw-r-- 2.0 unx  5965 b-  2421 defN 7-Jul-10 20:26 setuptools/command/setopt.pyc 
-rw-rw-r-- 2.0 unx  2283 b-  695 defN 19-Oct-09 17:50 setuptools/command/bdist_wininst.py 
-rw-rw-r-- 2.0 unx  7535 b-  3208 defN 7-Jul-10 20:26 setuptools/command/build_py.pyc 
-rw-rw-r-- 2.0 unx  3690 b-  1528 defN 7-Jul-10 20:26 setuptools/command/install.pyc 
-rw-rw-r-- 2.0 unx 14205 b-  4465 defN 19-Oct-09 13:35 setuptools/command/egg_info.py 
-rw-rw-r-- 2.0 unx  626 b-  311 defN 28-Dec-06 19:52 setuptools/command/__init__.py 
-rw-rw-r-- 2.0 unx  839 b-  494 defN 7-Jul-10 20:26 setuptools/command/__init__.pyc 
-rw-rw-r-- 2.0 unx  5053 b-  1519 defN 20-Sep-06 17:05 setuptools/command/setopt.py 
-rw-rw-r-- 2.0 unx  674 b-  329 defN 7-Jul-10 20:26 setuptools/command/register.pyc 
-rw-rw-r-- 2.0 unx  3724 b-  1292 defN 4-Sep-07 00:11 setuptools/command/install_egg_info.py 
-rw-rw-r-- 2.0 unx 18005 b-  5444 defN 19-Oct-09 13:35 setuptools/command/bdist_egg.py 
-rw-rw-r-- 2.0 unx  3984 b-  1385 defN 15-Feb-08 12:29 setuptools/command/install.py 
-rw-rw-r-- 2.0 unx  2356 b-  1002 defN 7-Jul-10 20:26 setuptools/command/bdist_wininst.pyc 
-rw-rw-r-- 2.0 unx  2025 b-  774 defN 22-May-07 17:55 setuptools/command/bdist_rpm.py 
-rw-rw-r-- 2.0 unx  2486 b-  871 defN 20-Sep-06 17:05 setuptools/command/install_lib.py 
-rw-rw-r-- 2.0 unx  740 b-  357 defN 20-Sep-06 17:05 setuptools/command/saveopts.py 
-rw-rw-r-- 2.0 unx 56980 b- 23198 defN 7-Jul-10 20:26 setuptools/command/easy_install.pyc 
-rw-rw-r-- 2.0 unx  3172 b-  1438 defN 7-Jul-10 20:26 setuptools/command/install_lib.pyc 
-rw-rw-r-- 2.0 unx  2257 b-  1013 defN 7-Jul-10 20:26 setuptools/command/bdist_rpm.pyc 
-rw-rw-r-- 2.0 unx  5310 b-  1732 defN 15-Feb-08 12:29 setuptools/command/develop.py 
-rw-rw-r-- 2.0 unx  5091 b-  2222 defN 7-Jul-10 20:26 setuptools/command/test.pyc 
-rw-rw-r-- 2.0 unx 63580 b- 17507 defN 19-Oct-09 13:35 setuptools/command/easy_install.py 
-rw-rw-r-- 2.0 unx 16467 b-  6544 defN 7-Jul-10 20:26 setuptools/command/egg_info.pyc 
-rw-rw-r-- 2.0 unx  4577 b-  1994 defN 7-Jul-10 20:26 setuptools/command/install_egg_info.pyc 
-rw-rw-r-- 2.0 unx  6275 b-  3108 defN 7-Jul-10 20:26 setuptools/command/upload.pyc 
-rw-rw-r-- 2.0 unx  7246 b-  2237 defN 20-Sep-06 17:05 setuptools/command/build_py.py 
-rw-rw-r-- 2.0 unx 10073 b-  4314 defN 7-Jul-10 20:26 setuptools/command/build_ext.pyc 
-rw-rw-r-- 2.0 unx  3185 b-  1463 defN 7-Jul-10 20:26 setuptools/command/alias.pyc 
-rw-rw-r-- 2.0 unx  1921 b-  704 defN 15-Feb-08 12:29 setuptools/command/install_scripts.py 
-rw-rw-r-- 2.0 unx  7327 b-  2380 defN 19-Oct-09 15:46 setuptools/command/sdist.py 
-rw-rw-r-- 2.0 unx  1249 b-  647 defN 7-Jul-10 20:26 setuptools/command/saveopts.pyc 
-rw-rw-r-- 2.0 unx  2021 b-  750 defN 20-Sep-06 17:05 setuptools/command/rotate.py 
-rw-rw-r-- 2.0 unx  2477 b-  848 defN 19-Oct-09 13:35 setuptools/command/alias.py 
-rw-rw-r-- 2.0 unx 17695 b-  7800 defN 7-Jul-10 20:26 setuptools/command/bdist_egg.pyc 
-rw-rw-r-- 2.0 unx  277 b-  158 defN 20-Sep-06 17:05 setuptools/command/register.py 
-rw-rw-r-- 2.0 unx  4442 b-  1424 defN 15-Feb-08 12:29 setuptools/command/test.py 
-rw-rw-r-- 2.0 unx  2445 b-  1160 defN 7-Jul-10 20:26 setuptools/command/install_scripts.pyc 
-rw-rw-r-- 2.0 unx  5175 b-  2317 defN 7-Jul-10 20:26 setuptools/command/develop.pyc 
78 files, 958981 bytes uncompressed, 321419 bytes compressed: 66.5% 
+2

+1. Янтарный ответ! – glglgl

+0

Это был быстрый и полный ответ, и я чувствую, что полностью понял его сейчас.Вы уже ответили на мои вопросы и очень помогли, но этот ответ был действительно особенным - спасибо! –

+0

Как известно оболочке, чтобы остановить синтаксический анализ файла после первых 8 строк? – jpmc26