setup.py是一个 python 文件,它通常告诉您要安装的模块 / 包已经与 Distutils 一起打包和分发,这是分发 Python 模块的标准。 
这使您可以轻松安装 Python 包。通常它写得足够:
$ python setup.py install并且模块将自行安装。
https://docs.python.org/3/installing/index.html#installing-index
它有助于在您的机器上安装 python 包foo (也可以在virtualenv ),以便您可以从其他项目以及 [I] Python 提示中导入包foo 。 
 它完成了与pip , easy_install等类似的工作, 
 使用setup.py 
让我们从一些定义开始:
 包 - 包含__init__.py文件的文件夹 / 目录。 
 Module - 扩展名为.py有效 python 文件。 
 分发 - 一个包与其他包和模块的关系 。 
假设您要安装名为foo的包。那你呢, 
$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install相反,如果您不想实际安装它但仍想使用它。然后做,
$ python setup.py develop此命令将为 site-packages 中的源目录创建符号链接,而不是复制内容。因此,它非常快(特别是对于大型包装)。
 创建setup.py 
如果你有你的包树,
foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
└── setup.py然后,在setup.py脚本中执行以下操作,以便可以在某台计算机上安装它: 
from setuptools import setup
setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)相反,如果您的包树更复杂,如下所示:
foo
├── foo
│   ├── data_struct.py
│   ├── __init__.py
│   └── internals.py
├── README
├── requirements.txt
├── scripts
│   ├── cool
│   └── skype
└── setup.py那么,在这种情况下你的setup.py就像: 
from setuptools import setup
setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='[email protected]',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
) 添加更多东西到( setup.py )并使其体面: 
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='[email protected]',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
) long_description在pypi.org 中用作包的 README 描述。 
最后,您现在已准备好将您的软件包上传到PyPi.org,以便其他人可以使用pip install yourpackage安装您的软件包。 
第一步是使用以下方法在 pypi 中声明您的包裹名称和空间:
$ python setup.py register一旦您的包裹名称被注册,没有人可以声明或使用它。注册成功后,您必须将包裹上传到云端(到云端),
$ python setup.py upload或者,您也可以使用GPG为您的包裹签名, 
$ python setup.py --sign upload 额外奖励 :请在此处查看真实项目中的setup.py示例: torchvision-setup.py 
 setup.py是 Python 对多平台安装程序和make文件的回答。 
如果您熟悉命令行安装,那么make && make install转换为python setup.py build && python setup.py install 。 
有些包是纯 Python,只是字节编译。其他可能包含本机代码,这将需要本机编译器(如gcc或cl )和 Python 接口模块(如swig或pyrex )。