我想从distutils创建一个仅字节码的分发(不是,我知道;我知道我在做什么)。使用setuptools和bdist_egg命令,您只需提供--exclude-source参数即可。不幸的是,标准命令没有这样的选项。
答案 0 :(得分:11)
distutils“build_py”命令是重要的,因为它(间接地)被创建分发的所有命令重用。如果覆盖byte_compile(files)方法,例如:
try:
from setuptools.command.build_py import build_py
except ImportError:
from distutils.command.build_py import build_py
class build_py(build_py)
def byte_compile(self, files):
super(build_py, self).byte_compile(files)
for file in files:
if file.endswith('.py'):
os.unlink(file)
setup(
...
cmdclass = dict(build_py=build_py),
...
)
您应该能够创建它,以便在将源文件复制到“install”目录(当bdist命令调用它们时是临时目录)之前从构建树中删除它们。
注意:我没有测试过这段代码; YMMV。
答案 1 :(得分:1)
试试这个:
from distutils.command.install_lib import install_lib
class install_lib(install_lib, object):
""" Class to overload install_lib so we remove .py files from the resulting
RPM """
def run(self):
""" Overload the run method and remove all .py files after compilation
"""
super(install_lib, self).run()
for filename in self.install():
if filename.endswith('.py'):
os.unlink(filename)
def get_outputs(self):
""" Overload the get_outputs method and remove any .py entries in the
file list """
filenames = super(install_lib, self).get_outputs()
return [filename for filename in filenames
if not filename.endswith('.py')]
答案 2 :(得分:1)
这里可能是一个完整的代码:)
try:
from setuptools.command.build_py import build_py
except ImportError:
from distutils.command.build_py import build_py
import os
import py_compile
class custom_build_pyc(build_py):
def byte_compile(self, files):
for file in files:
if file.endswith('.py'):
py_compile.compile(file)
os.unlink(file)
....
setup(
name= 'sample project',
cmdclass = dict(build_py=custom_build_pyc),
....
答案 3 :(得分:0)
“标准命令没有这样的选项”?
您是否安装了最新版本的setuptools
?你写了一个setup.py
文件吗?
如果是这样,这应该有效:python setup.py bdist_egg --exclude-source-files
。