nu *_*est 6 python setuptools package pypi
我正在工作blowdrycss
。存储库在这里。
我希望将 的设置文件blowdrycss_settings.py
从 pypi 上的最终包中排除。目的是动态构建将放置在用户 virtualenv / 项目文件夹中的自定义设置文件。
在setup.py
,我有以下内容:
packages=find_packages(exclude=['blowdrycss_settings.py', ]),
Run Code Online (Sandbox Code Playgroud)
我也试过exclude_package_data:
exclude_package_data={
'': ['blowdrycss_settings.py'],
'': ['blowdrycss/blowdrycss_settings.py'],
'blowdrycss': ['blowdrycss_settings.py'],
},
Run Code Online (Sandbox Code Playgroud)
我然后跑python setup.py sdist bdist
。
但是,当我查看构建文件夹时,我仍然看到blowdrycss_settings.py
:
- build
- lib
- blowdrycss_settings.py
Run Code Online (Sandbox Code Playgroud)
似乎只排除一个文件应该很简单。
如何blowdrycss_settings.py
从分布式包中排除?
假设你有一个项目
\n\nroot\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 spam\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bacon.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 eggs.py\n
Run Code Online (Sandbox Code Playgroud)\n\n并且您想spam/eggs.py
从包装中排除:
import fnmatch\nfrom setuptools import find_packages, setup\nfrom setuptools.command.build_py import build_py as build_py_orig\n\n\nexcluded = [\'spam/eggs.py\']\n\n\nclass build_py(build_py_orig):\n def find_package_modules(self, package, package_dir):\n modules = super().find_package_modules(package, package_dir)\n return [\n (pkg, mod, file)\n for (pkg, mod, file) in modules\n if not any(fnmatch.fnmatchcase(file, pat=pattern) for pattern in excluded)\n ]\n\n\nsetup(\n packages=find_packages(),\n cmdclass={\'build_py\': build_py}\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n列表中的全局变量和多个条目excluded
也可以工作,因为它被 消耗fnmatch
,所以你可以声明
excluded = [\n \'modules_in_directory/*.py\',\n \'modules_in_subtree/**/*.py\',\n \'path/to/other/module.py\'\n]\n
Run Code Online (Sandbox Code Playgroud)\n\nETC。
\n\n这个食谱基于我对问题setup.py 的其他答案,从 bdist\n 中排除一些 python 文件。不同之处在于,此配方排除基于文件 glob 的模块,而另一个配方排除基于限定名的模块,例如
\n\nexcluded = [\'spam.*\', \'*.settings\']\n
Run Code Online (Sandbox Code Playgroud)\n\n将排除spam
包的所有子模块以及settings
每个包和子包等中命名的所有模块。
这是我的解决方案。
在下面blowdrycss
,我创建了一个名为的新模块settings
,因此目录结构现在如下所示:
blowdrycss
blowdrycss
settings
blowdrycss_settings.py
Run Code Online (Sandbox Code Playgroud)
根据此参考,我的内部setup.py
有以下内容:
packages=find_packages(exclude=['*.settings', ]),
Run Code Online (Sandbox Code Playgroud)
构建发行版:
build
、dist
、 和.egg-info
文件夹。python setup.py sdist bdist
回想起来,还好我没能做到我最初想做的事情。新的结构感觉更干净并且更加模块化。