[英]How to exclude a single file from package with setuptools and setup.py
我正在研究blowdrycss
。 存儲庫在這里 。
我希望從pypi的最終包中排除blowdrycss_settings.py
的設置文件。 目的是動態構建一個自定義設置文件,該文件將放置在用戶virtualenv / project文件夾中。
在setup.py
,我有以下內容:
packages=find_packages(exclude=['blowdrycss_settings.py', ]),
我也嘗試過exclude_package_data :
exclude_package_data={
'': ['blowdrycss_settings.py'],
'': ['blowdrycss/blowdrycss_settings.py'],
'blowdrycss': ['blowdrycss_settings.py'],
},
然后我運行python setup.py sdist bdist
。
但是,當我查看build文件夾時,我仍然看到blowdrycss_settings.py
:
- build
- lib
- blowdrycss_settings.py
看起來排除文件應該很簡單。
如何從分布式軟件包中排除blowdrycss_settings.py
?
這是我的解決方案。
在blowdrycss
下面,我創建了一個名為settings
的新模塊,因此目錄結構現在看起來像這樣:
blowdrycss
blowdrycss
settings
blowdrycss_settings.py
基於此引用 ,在setup.py
我有以下內容:
packages=find_packages(exclude=['*.settings', ]),
要構建分發:
build
, dist
和.egg-info
文件夾。 python setup.py sdist bdist
回想起來,我無法做我最初嘗試的事情是好的。 新結構感覺更清潔,更模塊化。
想象一下,你有一個項目
root
├── setup.py
└── spam
├── __init__.py
├── bacon.py
└── eggs.py
並且您想要從包裝中排除spam/eggs.py
:
import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig
excluded = ['spam/eggs.py']
class build_py(build_py_orig):
def find_package_modules(self, package, package_dir):
modules = super().find_package_modules(package, package_dir)
return [
(pkg, mod, file)
for (pkg, mod, file) in modules
if not any(fnmatch.fnmatchcase(file, pat=pattern) for pattern in excluded)
]
setup(
packages=find_packages(),
cmdclass={'build_py': build_py}
)
excluded
列表中的Globs和多個條目也會起作用,因為它被fnmatch
,因此您可以聲明
excluded = [
'modules_in_directory/*.py',
'modules_in_subtree/**/*.py',
'path/to/other/module.py'
]
等等
這個配方基於我對setup.py問題的另一個答案 , 從bdist中排除了一些python文件 。 區別在於此配方不包括基於文件globs的模塊,而另一個不包括基於qualnames的模塊,例如
excluded = ['spam.*', '*.settings']
將排除spam
包的所有子模塊以及每個包和子包等中的所有模塊命名settings
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.