Nie*_*ore 8 egg setuptools python-wheel
背景:我有一个负责安全的源文件。其中有魔术键和特定算法。
是否可以从 python 蛋或轮包中删除这个单一的源文件?
我已经完成了使用 egg 命令只发送二进制文件。
python setup.py bdist_egg --exclude-source-files
Run Code Online (Sandbox Code Playgroud)
编辑项目结构:
??? setup.py
??? src
| ??? __init__.py
| ??? file1.py
| ??? file2.py
| ??? file_to_exclude.py
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
不幸的是,既distutils没有setuptools提供排除单个模块的可能性,也没有提供排除单个模块的可能性,因此您必须解决它。
我描述了一个更好的解决方案在这里模仿包排除setuptools确实在find_packages()。你将不得不覆盖build_py在安装脚本命令可以接受的排除模式,同一个名单exclude列表find_packages。在您的情况下,它将是:
import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig
exclude = ['src.file_to_exclude']
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(pkg + '.' + mod, pat=pattern)
for pattern in exclude)]
setup(
...,
packages=find_packages(),
cmdclass={'build_py': build_py},
)
Run Code Online (Sandbox Code Playgroud)
我发现这是一个比下面的更强大和更distutils符合的解决方案。它还允许通过通配符匹配排除多个模块,例如
exclude = ['src.file*']
Run Code Online (Sandbox Code Playgroud)
将排除所有以filein srcpackage开头的模块,或
exclude = ['*.file1']
Run Code Online (Sandbox Code Playgroud)
将排除file1.py在所有包中。
您可以使用setuptools可以排除包(包含__init__.py文件的目录)的事实,但这需要一些重构。创建一个package_to_exclude,放在file_to_exclude.py那里并修复所有最终的导入错误:
project
??? setup.py
??? src
??? __init__.py
??? file1.py
??? file2.py
??? package_to_exclude
??? __init__.py
??? file_to_exclude.py
Run Code Online (Sandbox Code Playgroud)
现在您可以package_to_exclude在设置脚本中排除:
from setuptools import find_packages, setup
setup(
...,
packages=find_packages(exclude=['src.package_to_exclude'])
)
Run Code Online (Sandbox Code Playgroud)
py_modules如果您不能或不想将模块移动到单独的包中,则可以排除该src包并将所有模块添加到src除file_to_excludein之外的所有模块py_modules。例子:
import os
from setuptools import find_packages, setup
excluded_files = ['file_to_exclude.py']
included_modules = ['src.' + os.path.splitext(f)[0]
for f in os.listdir('src')
if f not in excluded_files]
setup(
...,
packages=find_packages(exclude=['src']),
py_modules=included_modules,
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |