谁能解释一下setup.py
它是什么以及如何进行配置或使用?
谁能解释一下setup.py
它是什么以及如何进行配置或使用?
Answers:
setup.py
是一个python文件,通常会告诉您要安装的模块/软件包已与Distutils打包并分发,Distutils是分发Python模块的标准。
这使您可以轻松安装Python软件包。通常写就足够了:
$ pip install .
pip
将使用setup.py安装模块。避免setup.py
直接致电。
https://docs.python.org/3/installing/index.html#installing-index
setup.py
文件的用途。
它有助于foo
在您的计算机上安装python软件包(也可以位于中virtualenv
),以便您可以foo
从其他项目以及[I] Python提示符中导入该软件包。
它完成pip
,easy_install
等的类似工作,
使用 setup.py
让我们从一些定义开始:
包 -包含__init__.py
文件的文件夹/目录。
模块 -具有.py
扩展名的有效python文件。
分发 -一个软件包与其他软件包和模块的关系。
假设您要安装名为的软件包foo
。那你做
$ git clone https://github.com/user/foo
$ cd foo
$ python setup.py install
相反,如果您不想实际安装它,但仍然想使用它。然后做,
$ python setup.py develop
此命令将在站点包内创建到源目录的符号链接,而不是复制内容。因此,它非常快(特别是对于大包装)。
创造 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='foomail@foo.com',
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='foomail@foo.com',
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='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',
]
)
在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
requests
)的这个项目明确给出了setup.py的一个很好的例子– github.com/kennethreitz/setup.py
setup.py
是Python对多平台安装程序和make
文件的解答。
如果您熟悉命令行安装,请make && make install
转换为python setup.py build && python setup.py install
。
一些软件包是纯Python,并且仅按字节编译。其他可能包含本机代码,这将需要本机编译器(如gcc
或cl
)和Python接口模块(如swig
或pyrex
)。
python setup.py install
实际上python setup.py build
首先运行(因此,除非在特定情况下,否则您无需单独运行它们)。我相信make
始终需要在运行之前手动运行make install
。
make
不需要任何特定的参数(或顺序):完全取决于Makefile
哪个“目标”可用(以及以什么顺序调用它们)的创建者。由于裸Makefile
s为(通常)不是很便携,他们往往使用的命令,例如生成./configure
(自动工具)或cmake .
(CMake的),它是为此多达这些程序来定义是否需要显式运行make
之前make install
或没有。
如果您下载的软件包在根文件夹中具有“ setup.py”,则可以通过运行以下命令进行安装
python setup.py install
如果您正在开发项目,并且想知道此文件的用途,请查看有关编写安装脚本的Python文档。
setup.py
是通常用该语言编写的库或程序随附的Python脚本。目的是正确安装软件。
许多软件包将distutils
框架与结合使用setup.py
。
setup.py可以在两种情况下使用:首先,您要安装Python软件包。其次,您要创建自己的Python包。通常,标准的Python软件包具有几个重要文件,例如setup.py,setup.cfg和Manifest.in。当您创建Python软件包时,这三个文件将确定(egg-info文件夹下PKG-INFO中的内容)名称,版本,描述,其他所需的安装(通常在.txt文件中)以及其他几个参数。创建包时setup.py将读取setup.cfg(可以是tar.gz)。在Manifest.in中,您可以定义应包含在软件包中的内容。无论如何,您都可以使用setup.py做很多事情,例如
python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo] (to upload package to pypi or local repo)
还有许多其他命令可以与setup.py一起使用。求助
python setup.py --help-commands
python setup.py --help-commands
。在深入setup.py时非常有用。
当您通过setup.py
打开终端(Mac,Linux)或命令提示符(Windows)下载软件包时。使用“ cd
Tab”按钮并为您提供帮助,将路径设置为已下载文件的文件夹的正确位置,该文件夹位于setup.py
:
iMac:~ user $ cd path/pakagefolderwithsetupfile/
按Enter键,您应该会看到类似以下内容:
iMac:pakagefolderwithsetupfile user$
然后输入以下内容python setup.py install
:
iMac:pakagefolderwithsetupfile user$ python setup.py install
按enter
。做完了!
要安装已下载的Python软件包,请提取档案并在其中运行setup.py脚本:
python setup.py install
对我来说,这一直很奇怪。将包管理器指向下载位置会更自然,例如在Ruby和Nodejs中。gem install rails-4.1.1.gem
包管理器也更舒适,因为它既熟悉又可靠。另一方面,每个setup.py
都是新颖的,因为它是特定于包装的。它要求遵守约定“我相信此setup.py会接受与过去使用的命令相同的命令”。这是对精神意志力的遗憾。
我并不是说setup.py工作流的安全性不如包管理器(我知道Pip只是在内部运行setup.py),但是我肯定觉得这很麻烦。将所有命令都发送到同一个程序包管理器应用程序是一种和谐。您甚至可能会喜欢它。
setup.py
是与其他文件一样的Python文件。它可以采用任何名称,除非按惯例命名,否则setup.py
每个脚本都没有不同的过程。
最常setup.py
用于安装Python模块,但用于服务器其他目的:
模块:
也许这是setup.py
模块中最著名的用法。尽管可以使用来安装它们pip
,但pip
默认情况下不包括旧的Python版本,因此需要单独安装。
如果您想安装模块但不想安装pip
,则唯一的选择是从setup.py
文件安装模块。这可以通过完成python setup.py install
。这将Python模块安装到根字典(不pip
,easy_install
ECT)。
pip
失败时通常使用此方法。例如,如果所需软件包的正确Python版本pip
由于可能由于不再维护而无法提供,则下载源并运行python setup.py install
将执行相同的操作,除非需要编译的二进制文件(但将忽略编译的二进制文件)。 Python版本-除非返回错误)。
的另一种用法setup.py
是从源代码安装软件包。如果模块仍在开发中,则将无法使用wheel文件,并且唯一的安装方法是直接从源代码进行安装。
构建Python扩展:
构建模块后,可以使用distutils安装脚本将其转换为可分发的模块。一旦构建完成,就可以使用上面的命令进行安装。
安装脚本易于构建,一旦文件已正确配置并且可以通过运行进行编译python setup.py build
(请参阅所有命令的链接)。
再次setup.py
按易用性和惯例命名,但可以使用任何名称。
Cython:
setup.py
文件的另一种著名用法包括编译后的扩展名。这些需要具有用户定义值的安装脚本。它们允许快速执行(但一旦编译则依赖平台)。这是文档中的一个简单示例:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_modules = cythonize("hello.pyx"),
)
这可以通过编译 python setup.py build
Cx_Freeze:
需要安装脚本的另一个模块是cx_Freeze
。这会将Python脚本转换为可执行文件。这允许包括描述,名称,图标,包在内的许多命令包括,排除等,并且一旦运行将产生可分发的应用程序。文档中的示例:
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "guifoo",
version = "0.1",
description = "My GUI application!",
options = {"build_exe": build_exe_options},
executables = [Executable("guifoo.py", base=base)])
可以通过编译python setup.py build
。
那么什么是setup.py
文件?
很简单,它是一个在Python环境中构建或配置某些东西的脚本。
分发时,程序包应仅包含一个安装脚本,但将多个脚本组合成一个安装脚本并不少见。请注意,这经常涉及distutils
但并非总是如此(如我在上一个示例中所示)。要记住的事情是以某种方式配置Python包/脚本。
它使用名称,因此在构建或安装时始终可以使用相同的命令。
为简单起见,setup.py的运行就像"__main__"
您在调用安装函数时提到的其他答案一样。在setup.py内部,应该放置安装软件包所需的一切。
以下两节讨论了许多setup.py模块具有的两件事。
此功能允许您指定项目属性,例如项目的名称,版本。...最重要的是,如果其他功能打包正确,此功能将允许您安装其他功能。请参阅此网页以获取setuptools.setup的示例。setuptools.setup的
这些属性允许安装以下类型的软件包:
使用setuptools.findpackages导入到项目并在PyPI中列出的软件包:
packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])
软件包不在PyPI中,但可以使用dependency_links从URL下载
dependency_links=["http://peak.telecommunity.com/snapshots/",]
在理想的世界中,setuptools.setup
将为您处理所有事情。不幸的是,情况并非总是如此。有时,您需要做一些特定的事情,例如使用subprocess命令安装依赖项,以使要安装的系统处于正确的软件包状态。尝试避免这种情况,这些功能会造成混乱,并且在OS甚至发行版之间通常会有所不同。