python项目中setup.py文件

本文介绍了Python项目中setup.py文件的作用及使用方法,包括如何通过它创建源码包和安装模块,详细解释了setup函数的参数及其意义,并对比了setuptools与Distutils的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

setup.py文件

1.setup.py文件的作用

#setup.py
from setuptools import setup, find_packages

setup(
    name='dirbot',
    version='1.0',
    packages=find_packages(),
    entry_points={'scrapy': ['settings = dirbot.settings']},
)
dirbot项目目录
dirbot\
    dirlot\
        spiders\
            __init__.py
            dmoz.py
        __init__.py
        items.py
        pipelines.py
        settings.py
    .gitignore
    README.rst
    scrapy.cfg
    setup.py
运行python setup.py sdist为模块创建一个源码包
#python setup.py sdist
running sdist
running egg_info
creating dirbot.egg-info
writing dirbot.egg-info\PKG-INFO
writing top-level names to dirbot.egg-info\top_level.txt
writing dependency_links to dirbot.egg-info\dependency_links.txt
writing entry points to dirbot.egg-info\entry_points.txt
writing manifest file 'dirbot.egg-info\SOURCES.txt'
reading manifest file 'dirbot.egg-info\SOURCES.txt'
writing manifest file 'dirbot.egg-info\SOURCES.txt'
running check
warning: check: missing required meta-data: url

warning: check: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) must be supplied

creating dirbot-1.0
creating dirbot-1.0\dirbot
creating dirbot-1.0\dirbot.egg-info
creating dirbot-1.0\dirbot\spiders
copying files to dirbot-1.0...
copying README.rst -> dirbot-1.0
copying setup.py -> dirbot-1.0
copying dirbot\__init__.py -> dirbot-1.0\dirbot
copying dirbot\items.py -> dirbot-1.0\dirbot
copying dirbot\pipelines.py -> dirbot-1.0\dirbot
copying dirbot\settings.py -> dirbot-1.0\dirbot
copying dirbot.egg-info\PKG-INFO -> dirbot-1.0\dirbot.egg-info
copying dirbot.egg-info\SOURCES.txt -> dirbot-1.0\dirbot.egg-info
copying dirbot.egg-info\dependency_links.txt -> dirbot-1.0\dirbot.egg-info
copying dirbot.egg-info\entry_points.txt -> dirbot-1.0\dirbot.egg-info
copying dirbot.egg-info\top_level.txt -> dirbot-1.0\dirbot.egg-info
copying dirbot\spiders\__init__.py -> dirbot-1.0\dirbot\spiders
copying dirbot\spiders\dmoz.py -> dirbot-1.0\dirbot\spiders
Writing dirbot-1.0\setup.cfg
creating dist
Creating tar archive
removing 'dirbot-1.0' (and everything under it)
在当前目录下生成这样文件目录:
dist\
    dirbot-1.0.tar.gz
dirbot.egg-info\
    dependency_links.txt
    entry_points.txt
    PKG-INFO
    SOURCES.txt
    top_level.txt
在当前目录下,会创建dist目录,里面有个文件名为dirbot-1.0.tar.gz,这个就是可以分发的包(如果使用命令python setup.py bdist_egg,那么会在dist目录中生成dirbot-1.0-py2.7.egg包,setup.py中第一句引入需要改为from setuptools import setup)。使用者拿到这个包后,解压,到dirbot-1.0目录下执行:python setup.py install,那么,ditbot.py就会被拷贝到python类路径下,可以被导入使用(如果安装是egg文件,会把egg文件拷贝到dist-packages目录下)。
运行python setup.py install为安装模块
running install
running bdist_egg
running egg_info
writing dirbot.egg-info\PKG-INFO
writing top-level names to dirbot.egg-info\top_level.txt
writing dependency_links to dirbot.egg-info\dependency_links.txt
writing entry points to dirbot.egg-info\entry_points.txt
reading manifest file 'dirbot.egg-info\SOURCES.txt'
writing manifest file 'dirbot.egg-info\SOURCES.txt'
installing library code to build\bdist.win32\egg
running install_lib
running build_py
creating build
creating build\lib
creating build\lib\dirbot
copying dirbot\items.py -> build\lib\dirbot
copying dirbot\pipelines.py -> build\lib\dirbot
copying dirbot\settings.py -> build\lib\dirbot
copying dirbot\__init__.py -> build\lib\dirbot
creating build\lib\dirbot\spiders
copying dirbot\spiders\dmoz.py -> build\lib\dirbot\spiders
copying dirbot\spiders\__init__.py -> build\lib\dirbot\spiders
creating build\bdist.win32
creating build\bdist.win32\egg
creating build\bdist.win32\egg\dirbot
copying build\lib\dirbot\items.py -> build\bdist.win32\egg\dirbot
copying build\lib\dirbot\pipelines.py -> build\bdist.win32\egg\dirbot
copying build\lib\dirbot\settings.py -> build\bdist.win32\egg\dirbot
creating build\bdist.win32\egg\dirbot\spiders
copying build\lib\dirbot\spiders\dmoz.py -> build\bdist.win32\egg\dirbot\spiders
copying build\lib\dirbot\spiders\__init__.py -> build\bdist.win32\egg\dirbot\spiders
copying build\lib\dirbot\__init__.py -> build\bdist.win32\egg\dirbot
byte-compiling build\bdist.win32\egg\dirbot\items.py to items.pyc
byte-compiling build\bdist.win32\egg\dirbot\pipelines.py to pipelines.pyc
byte-compiling build\bdist.win32\egg\dirbot\settings.py to settings.pyc
byte-compiling build\bdist.win32\egg\dirbot\spiders\dmoz.py to dmoz.pyc
byte-compiling build\bdist.win32\egg\dirbot\spiders\__init__.py to __init__.pyc
byte-compiling build\bdist.win32\egg\dirbot\__init__.py to __init__.pyc
creating build\bdist.win32\egg\EGG-INFO
copying dirbot.egg-info\PKG-INFO -> build\bdist.win32\egg\EGG-INFO
copying dirbot.egg-info\SOURCES.txt -> build\bdist.win32\egg\EGG-INFO
copying dirbot.egg-info\dependency_links.txt -> build\bdist.win32\egg\EGG-INFO
copying dirbot.egg-info\entry_points.txt -> build\bdist.win32\egg\EGG-INFO
copying dirbot.egg-info\top_level.txt -> build\bdist.win32\egg\EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating 'dist\dirbot-1.0-py2.7.egg' and adding 'build\bdist.win32\egg' to it
removing 'build\bdist.win32\egg' (and everything under it)
Processing dirbot-1.0-py2.7.egg
Copying dirbot-1.0-py2.7.egg to c:\python27\lib\site-packages
Adding dirbot 1.0 to easy-install.pth file

Installed c:\python27\lib\site-packages\dirbot-1.0-py2.7.egg
Processing dependencies for dirbot==1.0
Finished processing dependencies for dirbot==1.0
安装该模块生成build文件目录
build\
    bdist.win32\
    lib\
        dirlot\
        spiders\
            __init__.py
            dmoz.py
        __init__.py
        items.py
        pipelines.py
        settings.py

2.setup函数还有一些参数:

1、packages
告诉Distutils需要处理那些包(包含__init__.py的文件夹)
2、package_dir
告诉Distutils哪些目录下的文件被映射到哪个源码包,感觉好像是一个相对路径的定义。一个例子:package_dir = {'': 'lib'},表示以lib为主目录。
3、ext_modules
是一个包含Extension实例的列表,Extension的定义也有一些参数。
4、ext_package
定义extension的相对路径
5、requires
定义依赖哪些模块
6、provides
定义可以为哪些模块提供依赖
7、scripts
指定python源码文件,可以从命令行执行。在安装时指定--install-script
8、package_data
通常包含与包实现相关的一些数据文件或类似于readme的文件。
package_data = {'': ['*.txt'], 'mypkg': ['data/*.dat'],}
表示包含所有目录下的txt文件和mypkg/data目录下的所有dat文件。
9、data_files
指定其他的一些文件(如配置文件)
setup(...,
    data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                ('config', ['cfg/data.cfg']),
                ('/etc/init.d', ['init-script'])]
    )

3.执行sdist命令时,默认会打包哪些东西呢?

  • 所有由py_modules或packages指定的源码文件
  • 所有由ext_modules或libraries指定的C源码文件
  • 由scripts指定的脚本文件
  • 类似于test/test*.py的文件
  • README.txt或README,setup.py,setup.cfg
  • 所有package_data或data_files指定的文件

4.Setuptools

上面的setup.py和setup.cfg都是遵循python标准库中的Distutils,而setuptools工具针对Python官方的distutils做了很多针对性的功能增强,比如依赖检查,动态扩展等。很多高级功能我就不详述了,自己也没有用过,等用的时候再作补充。详情可参见这里。
一个典型的遵循setuptools的脚本:
from setuptools import setup, find_packages
setup(
    name = "HelloWorld",
    version = "0.1",
    packages = find_packages(),
    scripts = ['say_hello.py'],
    # Project uses reStructuredText, so ensure that the docutils get
    # installed or upgraded on the target machine
    install_requires = ['docutils>=0.3'],
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.rst'],
        # include any *.msg files found in the 'hello' package, too:
        'hello': ['*.msg'],
    },
    # metadata for upload to PyPI
    author = "Me",
    author_email = "me@example.com",
    description = "This is an Example Package",
    license = "PSF",
    keywords = "hello world example examples",
    url = "http://example.com/HelloWorld/",   # project home page, if any
    # could also include long_description, download_url, classifiers, etc.
)
Setuptools相对distutils,增强的关键字:
include_package_data:为True时自动添加受版本控制的数据文件,可替代package_data,同时,exclude_package_data可以排除某些文件。当你需要加入没有被版本控制的文件时,还是老老实实使用package_data吧。
install_requires:代替require函数。表示当前包的安装依赖于哪些分发包,这些信息会写入egg的元信息中,这些包在安装时会自动(从PyPI)下载并安装。如果包在PyPI中找不到,则会从dependency_links标识的URL中获取。
extras_require:当前包的高级/额外特性需要依赖的分发包。
entry_points:这个很经典。见下面的讲解。
setup_requires: 安装脚本执行时需要依赖的分发包,主要用于构建过程。注意,这里列出的包不会自动安装,如果需要,同时要在install_requires中指定。
dependency_links:URL地址。这些地址在安装setup_requires或tests_require指定的包时使用。会写入egg的metadata信息中。
Python 项目中,`setup.py` 是一个核心文件,它主要用于管理项目的构建、打包和分发过程。该文件通常包含项目的元数据以及如何构建和安装模块的指令[^3]。 ### 基本作用 - **项目分发**:`setup.py` 文件项目分发和安装的核心脚本,使开发者能够轻松地分享和使用代码[^1]。 - **安装模块**:通过运行特定命令,如 `python setup.py install`,可以安装模块[^2]。 - **依赖管理**:`setup.py` 文件可以指定 package 的依赖、描述性的信息等[^4]。 - **入口点定义**:它可以定义控制台脚本的入口点,例如当运行某个命令时,指定执行哪个模块中的哪个函数[^5]。 ### 使用方法 要使用 `setup.py` 文件,首先需要确保已经安装了 `setuptools` 包。可以通过以下命令安装: ```bash pip install setuptools ``` 一旦有了 `setup.py` 文件,就可以使用多种命令来操作你的包。例如,要安装包,可以在包含 `setup.py` 文件的目录中运行: ```bash python setup.py install ``` 如果你希望以开发模式安装包(这样对源代码的更改会立即生效,无需重新安装),可以使用: ```bash pip install -e . ``` 此外,`setup.py` 还支持其他许多命令,比如 `sdist` 创建源码分发包,`bdist_wheel` 创建 wheel 包等。 ### 编写 setup.py 编写 `setup.py` 文件时,至少需要提供一些基本的信息,例如包名、版本号、包含的包列表等。下面是一个简单的例子,展示了如何创建一个名为 `ugit` 的模块,并设置一个控制台脚本入口点: ```python from setuptools import setup setup( name='ugit', version='1.0', packages=['ugit'], entry_points={ 'console_scripts': [ 'ugit = ugit.cli:main' ] } ) ``` 在这个例子中,当用户运行 `ugit` 命令时,程序将运行 `ugit.cli` 模块下的 `main` 函数[^5]。 ### 最佳实践 - 维护清晰的项目结构。 - 提供详尽的文档和注释。 - 使用虚拟环境来隔离不同项目的依赖。 - 利用现代工具如 `setuptools` 和 `wheel` 来简化打包和分发流程。 以上就是关于 `setup.py` 文件的基本作用及其使用方法的一些介绍。如果您有更具体的问题或者需要进一步的帮助,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值