给出以下(演示)项目布局:
MyProject/
README
LICENSE
setup.py
myproject/
... # packages
extrastuff/
... # some extra data
我如何(以及在何处)声明不同的分发类型?特别是我需要这两个选项:
仅包含来源的分发
包含(extrastuff)
理想情况下,如何声明上面两个配置,而第二个配置依赖于第一个配置?
答案 0 :(得分:11)
之前我已经实现了类似的东西......可以扩展sdist
命令以处理其他命令行参数并根据这些参数操作数据文件。如果你运行python setup.py sdist --help
,它将在帮助中包含你的自定义命令行参数,这很好。使用以下配方:
from distutils import log
from distutils.core import setup
from distutils.command.sdist import sdist
class CustomSdist(sdist):
user_options = [
('packaging=', None, "Some option to indicate what should be packaged")
] + sdist.user_options
def __init__(self, *args, **kwargs):
sdist.__init__(self, *args, **kwargs)
self.packaging = "default value for this option"
def get_file_list(self):
log.info("Chosen packaging option: {self.packaging}".format(self=self))
# Change the data_files list here based on the packaging option
self.distribution.data_files = list(
('folder', ['file1', 'file2'])
)
sdist.get_file_list(self)
if __name__ == "__main__":
setup(
name = "name",
version = "version",
author = "author",
author_email = "author_email",
url = "url",
py_modules = [
# ...
],
packages = [
# ...
],
# data_files = default data files for commands other than sdist if you wish
cmdclass={
'sdist': CustomSdist
}
)
答案 1 :(得分:3)
您可以扩展setup.py以另外包含一些自定义命令行解析。然后,您可以捕获自定义参数并将其删除,以使其不会影响setuptools
。
您可以访问sys.argv
中的命令行参数。至于修改对setuptools.setup()
的调用,我建议创建一个要传递的参数字典,根据命令行参数修改字典,然后使用setup()
表示法调用**dict
,如这样:
from setuptools import setup
import sys
basic = {'name': 'my program'}
extra = {'bonus': 'content'}
if '--extras' in sys.argv:
basic.update(extra)
sys.argv.remove('--extras')
setup(**basic)
要进行更彻底的命令行解析,如果您只针对Python 2.7及更高版本,也可以使用getopt
module或更新的argparse
module。
编辑:我还在distutils文档中找到了一个标题为Creating a new Distutils command的部分。这也可能是一个有用的资源。