What is setup.py?

后端 未结 10 1754
囚心锁ツ
囚心锁ツ 2020-11-22 09:59

Can anyone please explain what setup.py is and how it can be configured or used?

10条回答
  •  感动是毒
    2020-11-22 10:38

    It helps to install a python package foo on your machine (can also be in virtualenv) so that you can import the package foo from other projects and also from [I]Python prompts.

    It does the similar job of pip, easy_install etc.,


    Using setup.py

    Let's start with some definitions:

    Package - A folder/directory that contains __init__.py file.
    Module - A valid python file with .py extension.
    Distribution - How one package relates to other packages and modules.

    Let's say you want to install a package named foo. Then you do,

    $ git clone https://github.com/user/foo  
    $ cd foo
    $ python setup.py install
    

    Instead, if you don't want to actually install it but still would like to use it. Then do,

    $ python setup.py develop  
    

    This command will create symlinks to the source directory within site-packages instead of copying things. Because of this, it is quite fast (particularly for large packages).


    Creating setup.py

    If you have your package tree like,

    foo
    ├── foo
    │   ├── data_struct.py
    │   ├── __init__.py
    │   └── internals.py
    ├── README
    ├── requirements.txt
    └── setup.py
    

    Then, you do the following in your setup.py script so that it can be installed on some machine:

    from setuptools import setup
    
    setup(
       name='foo',
       version='1.0',
       description='A useful module',
       author='Man Foo',
       author_email='foomail@foo.com',
       packages=['foo'],  #same as name
       install_requires=['bar', 'greek'], #external packages as dependencies
    )
    

    Instead, if your package tree is more complex like the one below:

    foo
    ├── foo
    │   ├── data_struct.py
    │   ├── __init__.py
    │   └── internals.py
    ├── README
    ├── requirements.txt
    ├── scripts
    │   ├── cool
    │   └── skype
    └── setup.py
    

    Then, your setup.py in this case would be like:

    from setuptools import setup
    
    setup(
       name='foo',
       version='1.0',
       description='A useful module',
       author='Man Foo',
       author_email='foomail@foo.com',
       packages=['foo'],  #same as name
       install_requires=['bar', 'greek'], #external packages as dependencies
       scripts=[
                'scripts/cool',
                'scripts/skype',
               ]
    )
    

    Add more stuff to (setup.py) & make it decent:

    from setuptools import setup
    
    with open("README", 'r') as f:
        long_description = f.read()
    
    setup(
       name='foo',
       version='1.0',
       description='A useful module',
       license="MIT",
       long_description=long_description,
       author='Man Foo',
       author_email='foomail@foo.com',
       url="http://www.foopackage.com/",
       packages=['foo'],  #same as name
       install_requires=['bar', 'greek'], #external packages as dependencies
       scripts=[
                'scripts/cool',
                'scripts/skype',
               ]
    )
    

    The long_description is used in pypi.org as the README description of your package.


    And finally, you're now ready to upload your package to PyPi.org so that others can install your package using pip install yourpackage.

    First step is to claim your package name & space in pypi using:

    $ python setup.py register
    

    Once your package name is registered, nobody can claim or use it. After successful registration, you have to upload your package there (to the cloud) by,

    $ python setup.py upload
    

    Optionally, you can also sign your package with GPG by,

    $ python setup.py --sign upload
    

    Bonus: See a sample setup.py from a real project here: torchvision-setup.py

提交回复
热议问题