赞
踩
这个资料有很多,不多赘述,setup
函数常用的参数如下:
更多参数可见:https://setuptools.readthedocs.io/en/latest/setuptools.html
setup.py打包命令各参数详解:
>> python setup.py --help-commands
接下来以bandit 1.7.6为例进行讲解 :
egg-info目录是用于存储与Python包相关的元数据信息的目录。它通常位于包的顶级目录中,以”.egg-info”为后缀。egg-info目录中包含了一些文本文件,其中存储了包的名称、版本、作者、依赖项等重要信息。这些信息对于包的安装、发布和管理都是必要的。参考:Python Python包和egg-info目录|极客教程
- 目录: D:\MyPython\my_setup\bandit-1.7.6\bandit.egg-info
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2023/12/9 10:53 1 dependency_links.txt
- -a---- 2023/12/9 10:53 3822 entry_points.txt
- -a---- 2023/12/9 10:53 1 not-zip-safe
- -a---- 2023/12/9 10:53 47 pbr.json
- -a---- 2023/12/9 10:53 4885 PKG-INFO
- -a---- 2023/12/9 10:53 359 requires.txt
- -a---- 2023/12/9 10:53 8935 SOURCES.txt
- -a---- 2023/12/9 10:53 7 top_level.txt
其中,PKG-INFO
文件存储了关于包的详细信息,如名称、版本、作者、许可证等。top_level.txt
文件列出了包中的顶级模块。SOURCES.txt
文件记录了包中包含的所有源代码文件。dependency_links.txt
文件存储了与包相关的依赖项的URL链接。
pbr 是一个管理 python setuptools 的工具库(为了方便使用setuptools),pbr 模块读入 setup.cfg 文件的信息,并且给 setuptools 中的 setup hook 函数填写默认参数,提供更加有意义的行为。pbr只需要最小化的setup.py 文件。参考:python包管理和pbr — W.Young
- import setuptools
-
- setuptools.setup(
- python_requires=">=3.8", setup_requires=["pbr>=2.0.0"], pbr=True
- )
package名称在setup.cfg中定义:
- [metadata]
- name = bandit
entry_points
参数用来支持自动生成脚本,其值应该为是一个字典,从 entry_point 组名映射到一个表示 entry_point 的字符串或字符串列表:
- [entry_points]
- console_scripts =
- bandit = bandit.cli.main:main
- bandit-config-generator = bandit.cli.config_generator:main
- bandit-baseline = bandit.cli.baseline:main
- ...
build相当于把需要打包的文件先收集起来,如下,
- PS D:\MyPython\my_setup\bandit-1.7.6> python setup.py build
- running build
- running build_py
- creating build
- creating build\lib
- creating build\lib\bandit
- creating build\lib\bandit\blacklists
- copying bandit\blacklists\calls.py -> build\lib\bandit\blacklists
- copying bandit\blacklists\imports.py -> build\lib\bandit\blacklists
- copying bandit\blacklists\utils.py -> build\lib\bandit\blacklists
- copying bandit\blacklists\__init__.py -> build\lib\bandit\blacklists
- creating build\lib\bandit\core
- copying bandit\core\blacklisting.py -> build\lib\bandit\core
- copying bandit\core\config.py -> build\lib\bandit\core
- copying bandit\core\constants.py -> build\lib\bandit\core
- copying bandit\core\context.py -> build\lib\bandit\core
- copying bandit\core\docs_utils.py -> build\lib\bandit\core
- copying bandit\core\extension_loader.py -> build\lib\bandit\core
- copying bandit\core\issue.py -> build\lib\bandit\core
- copying bandit\core\manager.py -> build\lib\bandit\core
- copying bandit\core\meta_ast.py -> build\lib\bandit\core
- copying bandit\core\metrics.py -> build\lib\bandit\core
- copying bandit\core\node_visitor.py -> build\lib\bandit\core
- copying bandit\core\tester.py -> build\lib\bandit\core
- copying bandit\core\test_properties.py -> build\lib\bandit\core
- copying bandit\core\test_set.py -> build\lib\bandit\core
- copying bandit\core\utils.py -> build\lib\bandit\core
- copying bandit\core\__init__.py -> build\lib\bandit\core
- creating build\lib\bandit\cli
- copying bandit\cli\baseline.py -> build\lib\bandit\cli
- copying bandit\cli\config_generator.py -> build\lib\bandit\cli
- copying bandit\cli\main.py -> build\lib\bandit\cli
- copying bandit\cli\__init__.py -> build\lib\bandit\cli
- creating build\lib\bandit\plugins
- copying bandit\plugins\app_debug.py -> build\lib\bandit\plugins
- copying bandit\plugins\asserts.py -> build\lib\bandit\plugins
- copying bandit\plugins\crypto_request_no_cert_validation.py -> build\lib\bandit\plugins
- copying bandit\plugins\django_sql_injection.py -> build\lib\bandit\plugins
- copying bandit\plugins\django_xss.py -> build\lib\bandit\plugins
- copying bandit\plugins\exec.py -> build\lib\bandit\plugins
- copying bandit\plugins\general_bad_file_permissions.py -> build\lib\bandit\plugins
- copying bandit\plugins\general_bind_all_interfaces.py -> build\lib\bandit\plugins
- copying bandit\plugins\general_hardcoded_password.py -> build\lib\bandit\plugins
- copying bandit\plugins\general_hardcoded_tmp.py -> build\lib\bandit\plugins
- copying bandit\plugins\hashlib_insecure_functions.py -> build\lib\bandit\plugins
- copying bandit\plugins\injection_paramiko.py -> build\lib\bandit\plugins
- copying bandit\plugins\injection_shell.py -> build\lib\bandit\plugins
- copying bandit\plugins\injection_sql.py -> build\lib\bandit\plugins
- copying bandit\plugins\injection_wildcard.py -> build\lib\bandit\plugins
- copying bandit\plugins\insecure_ssl_tls.py -> build\lib\bandit\plugins
- copying bandit\plugins\jinja2_templates.py -> build\lib\bandit\plugins
- copying bandit\plugins\logging_config_insecure_listen.py -> build\lib\bandit\plugins
- copying bandit\plugins\mako_templates.py -> build\lib\bandit\plugins
- copying bandit\plugins\request_without_timeout.py -> build\lib\bandit\plugins
- copying bandit\plugins\snmp_security_check.py -> build\lib\bandit\plugins
- copying bandit\plugins\ssh_no_host_key_verification.py -> build\lib\bandit\plugins
- copying bandit\plugins\tarfile_unsafe_members.py -> build\lib\bandit\plugins
- copying bandit\plugins\try_except_continue.py -> build\lib\bandit\plugins
- copying bandit\plugins\try_except_pass.py -> build\lib\bandit\plugins
- copying bandit\plugins\weak_cryptographic_key.py -> build\lib\bandit\plugins
- copying bandit\plugins\yaml_load.py -> build\lib\bandit\plugins
- copying bandit\plugins\__init__.py -> build\lib\bandit\plugins
- copying bandit\__init__.py -> build\lib\bandit
- copying bandit\__main__.py -> build\lib\bandit
- creating build\lib\bandit\formatters
- copying bandit\formatters\csv.py -> build\lib\bandit\formatters
- copying bandit\formatters\custom.py -> build\lib\bandit\formatters
- copying bandit\formatters\html.py -> build\lib\bandit\formatters
- copying bandit\formatters\json.py -> build\lib\bandit\formatters
- copying bandit\formatters\screen.py -> build\lib\bandit\formatters
- copying bandit\formatters\text.py -> build\lib\bandit\formatters
- copying bandit\formatters\utils.py -> build\lib\bandit\formatters
- copying bandit\formatters\xml.py -> build\lib\bandit\formatters
- copying bandit\formatters\yaml.py -> build\lib\bandit\formatters
- copying bandit\formatters\__init__.py -> build\lib\bandit\formatters
- running egg_info
- writing bandit.egg-info\PKG-INFO
- writing dependency_links to bandit.egg-info\dependency_links.txt
- writing entry points to bandit.egg-info\entry_points.txt
- writing requirements to bandit.egg-info\requires.txt
- writing top-level names to bandit.egg-info\top_level.txt
- [pbr] Reusing existing SOURCES.txt
我们看到在同级目录下有个build目录生成,bandit-1.7.6\build\lib\bandit下就是源码文件。
- 目录: D:\MyPython\my_setup\bandit-1.7.6\build\lib\bandit
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 2024/1/20 21:08 blacklists
- d----- 2024/1/20 21:08 cli
- d----- 2024/1/20 21:08 core
- d----- 2024/1/20 21:08 formatters
- d----- 2024/1/20 21:08 plugins
- -a---- 2023/12/9 10:53 632 __init__.py
- -a---- 2023/12/9 10:53 571 __main__.py
执行如下命令查看所有命令;
python setup.py build --help
Options for 'build' command:
当前目录下生成了my_build的目录,里面是bandit的源码。
- python setup.py build --build-base my_build./my_build
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\output\lib\bandit
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 2024/1/20 23:07 blacklists
- d----- 2024/1/20 23:07 cli
- d----- 2024/1/20 23:07 core
- d----- 2024/1/20 23:07 formatters
- d----- 2024/1/20 23:07 plugins
- -a---- 2023/12/9 10:53 632 __init__.py
- -a---- 2023/12/9 10:53 571 __main__.py
注意多一层 lib目录,看着有点不舒服,可以通过--build-lib实现:
- python setup.py build --build-lib my_build
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\my_build
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 2024/1/20 23:15 bandit
install会将build/lib下的文件以及egg-info进行打包并进行二进制化成.egg文件,该文件在当前文件夹下的dist文件夹下,并且,会把这个egg文件复制到对应环境的site-packages包下面,此时可以直接import 这个egg中的内容,但是无法跳转,另外还会生成egg-info文件夹,里面就是一些文件:
执行如下命令查看所有命令:
python setup.py install --help
Options for 'LocalInstall' command:
python setup.py sdist不会生成build文件夹,只会生成dist和egg-info文件夹;但此时dist下面的不是egg文件,而是tar.gz文件,是一个打包文件,也是打包的相同的东西;
- D:\MyPython\my_setup\bandit-1.7.6> ls .\dist\
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/20 23:38 98707 bandit-1.7.6.tar.gz
其余的格式:
- python setup.py sdist --help-formats
-
- List of available source distribution formats:
- --formats=bztar bzip2'ed tar-file
- --formats=gztar gzip'ed tar-file
- --formats=tar uncompressed tar file
- --formats=xztar xz'ed tar-file
- --formats=zip ZIP file
- --formats=ztar compressed tar file
执行如下命令编译zip包:
python setup.py sdist --formats=zip
结果如下:
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/20 23:45 139518 bandit-1.7.6.zip
网上说sdist和bdist的区别一个是源码包,一个是二进制包;这里看到,bdist会同时生成build,dist,egg-info文件夹,且dist下面也会生成tar.gz文件,但我们可以看到,sdist和bdist生成的两个tar.gz文件是不一样的。
生成NT平台安装包(.zip)
- python setup.py bdist
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/20 23:38 98707 bandit-1.7.6.tar.gz
- -a---- 2024/1/20 23:50 388251 bandit-1.7.6.win-amd64.zip
- -a---- 2024/1/20 23:45 139518 bandit-1.7.6.zip
具体参数:
- List of available distribution formats:
- --formats=rpm RPM distribution
- --formats=gztar gzip'ed tar file
- --formats=bztar bzip2'ed tar file
- --formats=xztar xz'ed tar file
- --formats=ztar compressed tar file
- --formats=tar tar file
- --formats=wininst Windows executable installer
- --formats=zip ZIP file
- --formats=msi Microsoft Installer
- --formats=egg Python .egg file
生成NT平台安装包(tar.gz)
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/20 23:38 98707 bandit-1.7.6.tar.gz
- -a---- 2024/1/20 23:57 295291 bandit-1.7.6.win-amd64.tar.gz
- -a---- 2024/1/20 23:50 388251 bandit-1.7.6.win-amd64.zip
- -a---- 2024/1/20 23:45 139518 bandit-1.7.6.zip
生成NT平台安装包(.exe)
- python setup.py bdist_wininst
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/20 23:38 98707 bandit-1.7.6.tar.gz
- -a---- 2024/1/20 23:49 827272 bandit-1.7.6.win-amd64.exe
- -a---- 2024/1/20 23:57 295291 bandit-1.7.6.win-amd64.tar.gz
- -a---- 2024/1/20 23:50 388251 bandit-1.7.6.win-amd64.zip
- -a---- 2024/1/20 23:45 139518 bandit-1.7.6.zip
生成rpm包:
- python setup.py bdist_rpm
-
- running bdist_rpm
- error: don't know how to create RPM distributions on platform nt
出错了,再议再议。。。哈哈
生成wheel包:
- python setup.py bdist_wheel
-
- 目录: D:\MyPython\my_setup\bandit-1.7.6\dist
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2024/1/21 0:12 123459 bandit-1.7.6-py3-none-any.whl
- -a---- 2024/1/20 23:38 98707 bandit-1.7.6.tar.gz
- -a---- 2024/1/20 23:49 827272 bandit-1.7.6.win-amd64.exe
- -a---- 2024/1/20 23:57 295291 bandit-1.7.6.win-amd64.tar.gz
- -a---- 2024/1/20 23:50 388251 bandit-1.7.6.win-amd64.zip
- -a---- 2024/1/20 23:45 139518 bandit-1.7.6.zip
单独生成egg_info信息:
python setup.py egg_info
生成的目录还是原来的目录,如果想自定义目录呢?
- Options for 'LocalEggInfo' command:
- --egg-base (-e) directory containing .egg-info directories (default: top of the source tree)
- --tag-date (-d) Add date stamp (e.g. 20050528) to version number
- --tag-build (-b) Specify explicit tag to add to version number
- --no-date (-D) Don't include date stamp [default]
- 目录: D:\MyPython\my_setup\bandit-1.7.6\my_egg_info
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 2024/1/21 0:11 bandit.egg-info
--tag-build=NAME,-b NAME
将NAME附加到项目的版本字符串中。由于setuptools处理以字母“a”到“e”(如“alpha”、“beta”和“candidate”)开头的“预发布”版本后缀的方式,您通常希望使用“.build”或“.dev”这样的标记,因为这会导致版本号被认为低于项目的默认版本。(如果您想使版本号高于默认版本,您可以始终取消标记构建,然后使用以下一个或两个选项。)
如果在setup.cfg中设置了默认的构建标记,则可以在命令行中使用-b“”或--tag build=“”作为egg_info命令的参数来抑制它。
--tag-date,-d
在项目的版本号中添加一个格式为“-YYYYMMDD”(例如“-2005 0528”)的日期戳。
--no-date,-D
不要在版本号中包含日期戳。此选项包括在内,因此您可以覆盖setup.cfg中的默认设置。
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。