1===================================== 2The Internal Structure of Python Eggs 3===================================== 4 5STOP! This is not the first document you should read! 6 7 8 9---------------------- 10Eggs and their Formats 11---------------------- 12 13A "Python egg" is a logical structure embodying the release of a 14specific version of a Python project, comprising its code, resources, 15and metadata. There are multiple formats that can be used to physically 16encode a Python egg, and others can be developed. However, a key 17principle of Python eggs is that they should be discoverable and 18importable. That is, it should be possible for a Python application to 19easily and efficiently find out what eggs are present on a system, and 20to ensure that the desired eggs' contents are importable. 21 22There are two basic formats currently implemented for Python eggs: 23 241. ``.egg`` format: a directory or zipfile *containing* the project's 25 code and resources, along with an ``EGG-INFO`` subdirectory that 26 contains the project's metadata 27 282. ``.egg-info`` format: a file or directory placed *adjacent* to the 29 project's code and resources, that directly contains the project's 30 metadata. 31 32Both formats can include arbitrary Python code and resources, including 33static data files, package and non-package directories, Python 34modules, C extension modules, and so on. But each format is optimized 35for different purposes. 36 37The ``.egg`` format is well-suited to distribution and the easy 38uninstallation or upgrades of code, since the project is essentially 39self-contained within a single directory or file, unmingled with any 40other projects' code or resources. It also makes it possible to have 41multiple versions of a project simultaneously installed, such that 42individual programs can select the versions they wish to use. 43 44The ``.egg-info`` format, on the other hand, was created to support 45backward-compatibility, performance, and ease of installation for system 46packaging tools that expect to install all projects' code and resources 47to a single directory (e.g. ``site-packages``). Placing the metadata 48in that same directory simplifies the installation process, since it 49isn't necessary to create ``.pth`` files or otherwise modify 50``sys.path`` to include each installed egg. 51 52Its disadvantage, however, is that it provides no support for clean 53uninstallation or upgrades, and of course only a single version of a 54project can be installed to a given directory. Thus, support from a 55package management tool is required. (This is why setuptools' "install" 56command refers to this type of egg installation as "single-version, 57externally managed".) Also, they lack sufficient data to allow them to 58be copied from their installation source. easy_install can "ship" an 59application by copying ``.egg`` files or directories to a target 60location, but it cannot do this for ``.egg-info`` installs, because 61there is no way to tell what code and resources belong to a particular 62egg -- there may be several eggs "scrambled" together in a single 63installation location, and the ``.egg-info`` format does not currently 64include a way to list the files that were installed. (This may change 65in a future version.) 66 67 68Code and Resources 69================== 70 71The layout of the code and resources is dictated by Python's normal 72import layout, relative to the egg's "base location". 73 74For the ``.egg`` format, the base location is the ``.egg`` itself. That 75is, adding the ``.egg`` filename or directory name to ``sys.path`` 76makes its contents importable. 77 78For the ``.egg-info`` format, however, the base location is the 79directory that *contains* the ``.egg-info``, and thus it is the 80directory that must be added to ``sys.path`` to make the egg importable. 81(Note that this means that the "normal" installation of a package to a 82``sys.path`` directory is sufficient to make it an "egg" if it has an 83``.egg-info`` file or directory installed alongside of it.) 84 85 86Project Metadata 87================= 88 89If eggs contained only code and resources, there would of course be 90no difference between them and any other directory or zip file on 91``sys.path``. Thus, metadata must also be included, using a metadata 92file or directory. 93 94For the ``.egg`` format, the metadata is placed in an ``EGG-INFO`` 95subdirectory, directly within the ``.egg`` file or directory. For the 96``.egg-info`` format, metadata is stored directly within the 97``.egg-info`` directory itself. 98 99The minimum project metadata that all eggs must have is a standard 100Python ``PKG-INFO`` file, named ``PKG-INFO`` and placed within the 101metadata directory appropriate to the format. Because it's possible for 102this to be the only metadata file included, ``.egg-info`` format eggs 103are not required to be a directory; they can just be a ``.egg-info`` 104file that directly contains the ``PKG-INFO`` metadata. This eliminates 105the need to create a directory just to store one file. This option is 106*not* available for ``.egg`` formats, since setuptools always includes 107other metadata. (In fact, setuptools itself never generates 108``.egg-info`` files, either; the support for using files was added so 109that the requirement could easily be satisfied by other tools, such 110as distutils). 111 112In addition to the ``PKG-INFO`` file, an egg's metadata directory may 113also include files and directories representing various forms of 114optional standard metadata (see the section on `Standard Metadata`_, 115below) or user-defined metadata required by the project. For example, 116some projects may define a metadata format to describe their application 117plugins, and metadata in this format would then be included by plugin 118creators in their projects' metadata directories. 119 120 121Filename-Embedded Metadata 122========================== 123 124To allow introspection of installed projects and runtime resolution of 125inter-project dependencies, a certain amount of information is embedded 126in egg filenames. At a minimum, this includes the project name, and 127ideally will also include the project version number. Optionally, it 128can also include the target Python version and required runtime 129platform if platform-specific C code is included. The syntax of an 130egg filename is as follows:: 131 132 name ["-" version ["-py" pyver ["-" required_platform]]] "." ext 133 134The "name" and "version" should be escaped using the ``to_filename()`` 135function provided by ``pkg_resources``, after first processing them with 136``safe_name()`` and ``safe_version()`` respectively. These latter two 137functions can also be used to later "unescape" these parts of the 138filename. (For a detailed description of these transformations, please 139see the "Parsing Utilities" section of the ``pkg_resources`` manual.) 140 141The "pyver" string is the Python major version, as found in the first 1423 characters of ``sys.version``. "required_platform" is essentially 143a distutils ``get_platform()`` string, but with enhancements to properly 144distinguish Mac OS versions. (See the ``get_build_platform()`` 145documentation in the "Platform Utilities" section of the 146``pkg_resources`` manual for more details.) 147 148Finally, the "ext" is either ``.egg`` or ``.egg-info``, as appropriate 149for the egg's format. 150 151Normally, an egg's filename should include at least the project name and 152version, as this allows the runtime system to find desired project 153versions without having to read the egg's PKG-INFO to determine its 154version number. 155 156Setuptools, however, only includes the version number in the filename 157when an ``.egg`` file is built using the ``bdist_egg`` command, or when 158an ``.egg-info`` directory is being installed by the 159``install_egg_info`` command. When generating metadata for use with the 160original source tree, it only includes the project name, so that the 161directory will not have to be renamed each time the project's version 162changes. 163 164This is especially important when version numbers change frequently, and 165the source metadata directory is kept under version control with the 166rest of the project. (As would be the case when the project's source 167includes project-defined metadata that is not generated from by 168setuptools from data in the setup script.) 169 170 171Egg Links 172========= 173 174In addition to the ``.egg`` and ``.egg-info`` formats, there is a third 175egg-related extension that you may encounter on occasion: ``.egg-link`` 176files. 177 178These files are not eggs, strictly speaking. They simply provide a way 179to reference an egg that is not physically installed in the desired 180location. They exist primarily as a cross-platform alternative to 181symbolic links, to support "installing" code that is being developed in 182a different location than the desired installation location. For 183example, if a user is developing an application plugin in their home 184directory, but the plugin needs to be "installed" in an application 185plugin directory, running "setup.py develop -md /path/to/app/plugins" 186will install an ``.egg-link`` file in ``/path/to/app/plugins``, that 187tells the egg runtime system where to find the actual egg (the user's 188project source directory and its ``.egg-info`` subdirectory). 189 190``.egg-link`` files are named following the format for ``.egg`` and 191``.egg-info`` names, but only the project name is included; no version, 192Python version, or platform information is included. When the runtime 193searches for available eggs, ``.egg-link`` files are opened and the 194actual egg file/directory name is read from them. 195 196Each ``.egg-link`` file should contain a single file or directory name, 197with no newlines. This filename should be the base location of one or 198more eggs. That is, the name must either end in ``.egg``, or else it 199should be the parent directory of one or more ``.egg-info`` format eggs. 200 201As of setuptools 0.6c6, the path may be specified as a platform-independent 202(i.e. ``/``-separated) relative path from the directory containing the 203``.egg-link`` file, and a second line may appear in the file, specifying a 204platform-independent relative path from the egg's base directory to its 205setup script directory. This allows installation tools such as EasyInstall 206to find the project's setup directory and build eggs or perform other setup 207commands on it. 208 209 210----------------- 211Standard Metadata 212----------------- 213 214In addition to the minimum required ``PKG-INFO`` metadata, projects can 215include a variety of standard metadata files or directories, as 216described below. Except as otherwise noted, these files and directories 217are automatically generated by setuptools, based on information supplied 218in the setup script or through analysis of the project's code and 219resources. 220 221Most of these files and directories are generated via "egg-info 222writers" during execution of the setuptools ``egg_info`` command, and 223are listed in the ``egg_info.writers`` entry point group defined by 224setuptools' own ``setup.py`` file. 225 226Project authors can register their own metadata writers as entry points 227in this group (as described in the setuptools manual under "Adding new 228EGG-INFO Files") to cause setuptools to generate project-specific 229metadata files or directories during execution of the ``egg_info`` 230command. It is up to project authors to document these new metadata 231formats, if they create any. 232 233 234``.txt`` File Formats 235===================== 236 237Files described in this section that have ``.txt`` extensions have a 238simple lexical format consisting of a sequence of text lines, each line 239terminated by a linefeed character (regardless of platform). Leading 240and trailing whitespace on each line is ignored, as are blank lines and 241lines whose first nonblank character is a ``#`` (comment symbol). (This 242is the parsing format defined by the ``yield_lines()`` function of 243the ``pkg_resources`` module.) 244 245All ``.txt`` files defined by this section follow this format, but some 246are also "sectioned" files, meaning that their contents are divided into 247sections, using square-bracketed section headers akin to Windows 248``.ini`` format. Note that this does *not* imply that the lines within 249the sections follow an ``.ini`` format, however. Please see an 250individual metadata file's documentation for a description of what the 251lines and section names mean in that particular file. 252 253Sectioned files can be parsed using the ``split_sections()`` function; 254see the "Parsing Utilities" section of the ``pkg_resources`` manual for 255for details. 256 257 258Dependency Metadata 259=================== 260 261 262``requires.txt`` 263---------------- 264 265This is a "sectioned" text file. Each section is a sequence of 266"requirements", as parsed by the ``parse_requirements()`` function; 267please see the ``pkg_resources`` manual for the complete requirement 268parsing syntax. 269 270The first, unnamed section (i.e., before the first section header) in 271this file is the project's core requirements, which must be installed 272for the project to function. (Specified using the ``install_requires`` 273keyword to ``setup()``). 274 275The remaining (named) sections describe the project's "extra" 276requirements, as specified using the ``extras_require`` keyword to 277``setup()``. The section name is the name of the optional feature, and 278the section body lists that feature's dependencies. 279 280Note that it is not normally necessary to inspect this file directly; 281``pkg_resources.Distribution`` objects have a ``requires()`` method 282that can be used to obtain ``Requirement`` objects describing the 283project's core and optional dependencies. 284 285 286``setup_requires.txt`` 287---------------------- 288 289Much like ``requires.txt`` except represents the requirements 290specified by the ``setup_requires`` parameter to the Distribution. 291 292 293``dependency_links.txt`` 294------------------------ 295 296A list of dependency URLs, one per line, as specified using the 297``dependency_links`` keyword to ``setup()``. These may be direct 298download URLs, or the URLs of web pages containing direct download 299links. Please see the setuptools manual for more information on 300specifying this option. 301 302 303``depends.txt`` -- Obsolete, do not create! 304------------------------------------------- 305 306This file follows an identical format to ``requires.txt``, but is 307obsolete and should not be used. The earliest versions of setuptools 308required users to manually create and maintain this file, so the runtime 309still supports reading it, if it exists. The new filename was created 310so that it could be automatically generated from ``setup()`` information 311without overwriting an existing hand-created ``depends.txt``, if one 312was already present in the project's source ``.egg-info`` directory. 313 314 315``namespace_packages.txt`` -- Namespace Package Metadata 316======================================================== 317 318A list of namespace package names, one per line, as supplied to the 319``namespace_packages`` keyword to ``setup()``. Please see the manuals 320for setuptools and ``pkg_resources`` for more information about 321namespace packages. 322 323 324``entry_points.txt`` -- "Entry Point"/Plugin Metadata 325===================================================== 326 327This is a "sectioned" text file, whose contents encode the 328``entry_points`` keyword supplied to ``setup()``. All sections are 329named, as the section names specify the entry point groups in which the 330corresponding section's entry points are registered. 331 332Each section is a sequence of "entry point" lines, each parseable using 333the ``EntryPoint.parse`` classmethod; please see the ``pkg_resources`` 334manual for the complete entry point parsing syntax. 335 336Note that it is not necessary to parse this file directly; the 337``pkg_resources`` module provides a variety of APIs to locate and load 338entry points automatically. Please see the setuptools and 339``pkg_resources`` manuals for details on the nature and uses of entry 340points. 341 342 343The ``scripts`` Subdirectory 344============================ 345 346This directory is currently only created for ``.egg`` files built by 347the setuptools ``bdist_egg`` command. It will contain copies of all 348of the project's "traditional" scripts (i.e., those specified using the 349``scripts`` keyword to ``setup()``). This is so that they can be 350reconstituted when an ``.egg`` file is installed. 351 352The scripts are placed here using the distutils' standard 353``install_scripts`` command, so any ``#!`` lines reflect the Python 354installation where the egg was built. But instead of copying the 355scripts to the local script installation directory, EasyInstall writes 356short wrapper scripts that invoke the original scripts from inside the 357egg, after ensuring that sys.path includes the egg and any eggs it 358depends on. For more about `script wrappers`_, see the section below on 359`Installation and Path Management Issues`_. 360 361 362Zip Support Metadata 363==================== 364 365 366``native_libs.txt`` 367------------------- 368 369A list of C extensions and other dynamic link libraries contained in 370the egg, one per line. Paths are ``/``-separated and relative to the 371egg's base location. 372 373This file is generated as part of ``bdist_egg`` processing, and as such 374only appears in ``.egg`` files (and ``.egg`` directories created by 375unpacking them). It is used to ensure that all libraries are extracted 376from a zipped egg at the same time, in case there is any direct linkage 377between them. Please see the `Zip File Issues`_ section below for more 378information on library and resource extraction from ``.egg`` files. 379 380 381``eager_resources.txt`` 382----------------------- 383 384A list of resource files and/or directories, one per line, as specified 385via the ``eager_resources`` keyword to ``setup()``. Paths are 386``/``-separated and relative to the egg's base location. 387 388Resource files or directories listed here will be extracted 389simultaneously, if any of the named resources are extracted, or if any 390native libraries listed in ``native_libs.txt`` are extracted. Please 391see the setuptools manual for details on what this feature is used for 392and how it works, as well as the `Zip File Issues`_ section below. 393 394 395``zip-safe`` and ``not-zip-safe`` 396--------------------------------- 397 398These are zero-length files, and either one or the other should exist. 399If ``zip-safe`` exists, it means that the project will work properly 400when installed as an ``.egg`` zipfile, and conversely the existence of 401``not-zip-safe`` means the project should not be installed as an 402``.egg`` file. The ``zip_safe`` option to setuptools' ``setup()`` 403determines which file will be written. If the option isn't provided, 404setuptools attempts to make its own assessment of whether the package 405can work, based on code and content analysis. 406 407If neither file is present at installation time, EasyInstall defaults 408to assuming that the project should be unzipped. (Command-line options 409to EasyInstall, however, take precedence even over an existing 410``zip-safe`` or ``not-zip-safe`` file.) 411 412Note that these flag files appear only in ``.egg`` files generated by 413``bdist_egg``, and in ``.egg`` directories created by unpacking such an 414``.egg`` file. 415 416 417 418``top_level.txt`` -- Conflict Management Metadata 419================================================= 420 421This file is a list of the top-level module or package names provided 422by the project, one Python identifier per line. 423 424Subpackages are not included; a project containing both a ``foo.bar`` 425and a ``foo.baz`` would include only one line, ``foo``, in its 426``top_level.txt``. 427 428This data is used by ``pkg_resources`` at runtime to issue a warning if 429an egg is added to ``sys.path`` when its contained packages may have 430already been imported. 431 432(It was also once used to detect conflicts with non-egg packages at 433installation time, but in more recent versions, setuptools installs eggs 434in such a way that they always override non-egg packages, thus 435preventing a problem from arising.) 436 437 438``SOURCES.txt`` -- Source Files Manifest 439======================================== 440 441This file is roughly equivalent to the distutils' ``MANIFEST`` file. 442The differences are as follows: 443 444* The filenames always use ``/`` as a path separator, which must be 445 converted back to a platform-specific path whenever they are read. 446 447* The file is automatically generated by setuptools whenever the 448 ``egg_info`` or ``sdist`` commands are run, and it is *not* 449 user-editable. 450 451Although this metadata is included with distributed eggs, it is not 452actually used at runtime for any purpose. Its function is to ensure 453that setuptools-built *source* distributions can correctly discover 454what files are part of the project's source, even if the list had been 455generated using revision control metadata on the original author's 456system. 457 458In other words, ``SOURCES.txt`` has little or no runtime value for being 459included in distributed eggs, and it is possible that future versions of 460the ``bdist_egg`` and ``install_egg_info`` commands will strip it before 461installation or distribution. Therefore, do not rely on its being 462available outside of an original source directory or source 463distribution. 464 465 466------------------------------ 467Other Technical Considerations 468------------------------------ 469 470 471Zip File Issues 472=============== 473 474Although zip files resemble directories, they are not fully 475substitutable for them. Most platforms do not support loading dynamic 476link libraries contained in zipfiles, so it is not possible to directly 477import C extensions from ``.egg`` zipfiles. Similarly, there are many 478existing libraries -- whether in Python or C -- that require actual 479operating system filenames, and do not work with arbitrary "file-like" 480objects or in-memory strings, and thus cannot operate directly on the 481contents of zip files. 482 483To address these issues, the ``pkg_resources`` module provides a 484"resource API" to support obtaining either the contents of a resource, 485or a true operating system filename for the resource. If the egg 486containing the resource is a directory, the resource's real filename 487is simply returned. However, if the egg is a zipfile, then the 488resource is first extracted to a cache directory, and the filename 489within the cache is returned. 490 491The cache directory is determined by the ``pkg_resources`` API; please 492see the ``set_cache_path()`` and ``get_default_cache()`` documentation 493for details. 494 495 496The Extraction Process 497---------------------- 498 499Resources are extracted to a cache subdirectory whose name is based 500on the enclosing ``.egg`` filename and the path to the resource. If 501there is already a file of the correct name, size, and timestamp, its 502filename is returned to the requester. Otherwise, the desired file is 503extracted first to a temporary name generated using 504``mkstemp(".$extract",target_dir)``, and then its timestamp is set to 505match the one in the zip file, before renaming it to its final name. 506(Some collision detection and resolution code is used to handle the 507fact that Windows doesn't overwrite files when renaming.) 508 509If a resource directory is requested, all of its contents are 510recursively extracted in this fashion, to ensure that the directory 511name can be used as if it were valid all along. 512 513If the resource requested for extraction is listed in the 514``native_libs.txt`` or ``eager_resources.txt`` metadata files, then 515*all* resources listed in *either* file will be extracted before the 516requested resource's filename is returned, thus ensuring that all 517C extensions and data used by them will be simultaneously available. 518 519 520Extension Import Wrappers 521------------------------- 522 523Since Python's built-in zip import feature does not support loading 524C extension modules from zipfiles, the setuptools ``bdist_egg`` command 525generates special import wrappers to make it work. 526 527The wrappers are ``.py`` files (along with corresponding ``.pyc`` 528and/or ``.pyo`` files) that have the same module name as the 529corresponding C extension. These wrappers are located in the same 530package directory (or top-level directory) within the zipfile, so that 531say, ``foomodule.so`` will get a corresponding ``foo.py``, while 532``bar/baz.pyd`` will get a corresponding ``bar/baz.py``. 533 534These wrapper files contain a short stanza of Python code that asks 535``pkg_resources`` for the filename of the corresponding C extension, 536then reloads the module using the obtained filename. This will cause 537``pkg_resources`` to first ensure that all of the egg's C extensions 538(and any accompanying "eager resources") are extracted to the cache 539before attempting to link to the C library. 540 541Note, by the way, that ``.egg`` directories will also contain these 542wrapper files. However, Python's default import priority is such that 543C extensions take precedence over same-named Python modules, so the 544import wrappers are ignored unless the egg is a zipfile. 545 546 547Installation and Path Management Issues 548======================================= 549 550Python's initial setup of ``sys.path`` is very dependent on the Python 551version and installation platform, as well as how Python was started 552(i.e., script vs. ``-c`` vs. ``-m`` vs. interactive interpreter). 553In fact, Python also provides only two relatively robust ways to affect 554``sys.path`` outside of direct manipulation in code: the ``PYTHONPATH`` 555environment variable, and ``.pth`` files. 556 557However, with no cross-platform way to safely and persistently change 558environment variables, this leaves ``.pth`` files as EasyInstall's only 559real option for persistent configuration of ``sys.path``. 560 561But ``.pth`` files are rather strictly limited in what they are allowed 562to do normally. They add directories only to the *end* of ``sys.path``, 563after any locally-installed ``site-packages`` directory, and they are 564only processed *in* the ``site-packages`` directory to start with. 565 566This is a double whammy for users who lack write access to that 567directory, because they can't create a ``.pth`` file that Python will 568read, and even if a sympathetic system administrator adds one for them 569that calls ``site.addsitedir()`` to allow some other directory to 570contain ``.pth`` files, they won't be able to install newer versions of 571anything that's installed in the systemwide ``site-packages``, because 572their paths will still be added *after* ``site-packages``. 573 574So EasyInstall applies two workarounds to solve these problems. 575 576The first is that EasyInstall leverages ``.pth`` files' "import" feature 577to manipulate ``sys.path`` and ensure that anything EasyInstall adds 578to a ``.pth`` file will always appear before both the standard library 579and the local ``site-packages`` directories. Thus, it is always 580possible for a user who can write a Python-read ``.pth`` file to ensure 581that their packages come first in their own environment. 582 583Second, when installing to a ``PYTHONPATH`` directory (as opposed to 584a "site" directory like ``site-packages``) EasyInstall will also install 585a special version of the ``site`` module. Because it's in a 586``PYTHONPATH`` directory, this module will get control before the 587standard library version of ``site`` does. It will record the state of 588``sys.path`` before invoking the "real" ``site`` module, and then 589afterwards it processes any ``.pth`` files found in ``PYTHONPATH`` 590directories, including all the fixups needed to ensure that eggs always 591appear before the standard library in sys.path, but are in a relative 592order to one another that is defined by their ``PYTHONPATH`` and 593``.pth``-prescribed sequence. 594 595The net result of these changes is that ``sys.path`` order will be 596as follows at runtime: 597 5981. The ``sys.argv[0]`` directory, or an empty string if no script 599 is being executed. 600 6012. All eggs installed by EasyInstall in any ``.pth`` file in each 602 ``PYTHONPATH`` directory, in order first by ``PYTHONPATH`` order, 603 then normal ``.pth`` processing order (which is to say alphabetical 604 by ``.pth`` filename, then by the order of listing within each 605 ``.pth`` file). 606 6073. All eggs installed by EasyInstall in any ``.pth`` file in each "site" 608 directory (such as ``site-packages``), following the same ordering 609 rules as for the ones on ``PYTHONPATH``. 610 6114. The ``PYTHONPATH`` directories themselves, in their original order 612 6135. Any paths from ``.pth`` files found on ``PYTHONPATH`` that were *not* 614 eggs installed by EasyInstall, again following the same relative 615 ordering rules. 616 6176. The standard library and "site" directories, along with the contents 618 of any ``.pth`` files found in the "site" directories. 619 620Notice that sections 1, 4, and 6 comprise the "normal" Python setup for 621``sys.path``. Sections 2 and 3 are inserted to support eggs, and 622section 5 emulates what the "normal" semantics of ``.pth`` files on 623``PYTHONPATH`` would be if Python natively supported them. 624 625For further discussion of the tradeoffs that went into this design, as 626well as notes on the actual magic inserted into ``.pth`` files to make 627them do these things, please see also the following messages to the 628distutils-SIG mailing list: 629 630* http://mail.python.org/pipermail/distutils-sig/2006-February/006026.html 631* http://mail.python.org/pipermail/distutils-sig/2006-March/006123.html 632 633 634Script Wrappers 635--------------- 636 637EasyInstall never directly installs a project's original scripts to 638a script installation directory. Instead, it writes short wrapper 639scripts that first ensure that the project's dependencies are active 640on sys.path, before invoking the original script. These wrappers 641have a #! line that points to the version of Python that was used to 642install them, and their second line is always a comment that indicates 643the type of script wrapper, the project version required for the script 644to run, and information identifying the script to be invoked. 645 646The format of this marker line is:: 647 648 "# EASY-INSTALL-" script_type ": " tuple_of_strings "\n" 649 650The ``script_type`` is one of ``SCRIPT``, ``DEV-SCRIPT``, or 651``ENTRY-SCRIPT``. The ``tuple_of_strings`` is a comma-separated 652sequence of Python string constants. For ``SCRIPT`` and ``DEV-SCRIPT`` 653wrappers, there are two strings: the project version requirement, and 654the script name (as a filename within the ``scripts`` metadata 655directory). For ``ENTRY-SCRIPT`` wrappers, there are three: 656the project version requirement, the entry point group name, and the 657entry point name. (See the "Automatic Script Creation" section in the 658setuptools manual for more information about entry point scripts.) 659 660In each case, the project version requirement string will be a string 661parseable with the ``pkg_resources`` modules' ``Requirement.parse()`` 662classmethod. The only difference between a ``SCRIPT`` wrapper and a 663``DEV-SCRIPT`` is that a ``DEV-SCRIPT`` actually executes the original 664source script in the project's source tree, and is created when the 665"setup.py develop" command is run. A ``SCRIPT`` wrapper, on the other 666hand, uses the "installed" script written to the ``EGG-INFO/scripts`` 667subdirectory of the corresponding ``.egg`` zipfile or directory. 668(``.egg-info`` eggs do not have script wrappers associated with them, 669except in the "setup.py develop" case.) 670 671The purpose of including the marker line in generated script wrappers is 672to facilitate introspection of installed scripts, and their relationship 673to installed eggs. For example, an uninstallation tool could use this 674data to identify what scripts can safely be removed, and/or identify 675what scripts would stop working if a particular egg is uninstalled. 676