如何在Python2.7中使用distutils进行增量构建? 我使用Python 2.7 ditudil来构建C++库。但是每次我用 python setup.py build
所有对象文件都将重新生成,即使c++文件没有更改。如何在Python2.7中使用distutils进行增量构建? 我使用Python 2.7 ditudil来构建C++库。但是每次我用 python setup.py build,python,build,python-2.7,distutils,python-2.6,Python,Build,Python 2.7,Distutils,Python 2.6,所有对象文件都将重新生成,即使c++文件没有更改。 我的一位朋友告诉我,Python 2.6不会出现这种情况 我向委员会提出的问题: 有没有办法强制distutils以增量方式构建代码 如果无法增量生成代码, 2.1. 有没有办法使用Python 2.6 distutils或 2.2. 是否可以修改Python2.7distuils包 你不能那样做。编译后的.o文件以一种简单且有缺陷的方式被重用,因此这种优化在2.7中被删除。有关详细信息,请参阅。我不知道这是否解决了您的确切问题,但我有一个类似
我的一位朋友告诉我,Python 2.6不会出现这种情况 我向委员会提出的问题:
2.1. 有没有办法使用Python 2.6 distutils或
2.2. 是否可以修改Python2.7distuils包
你不能那样做。编译后的.o文件以一种简单且有缺陷的方式被重用,因此这种优化在2.7中被删除。有关详细信息,请参阅。我不知道这是否解决了您的确切问题,但我有一个类似的问题,我通过以下方法解决了该问题:
我有一个比较大的C++包,其中包含了基于Cython的Python包装器。我最后做的是使用CMake将包编译成一个静态库(它进行增量构建),然后在静态库中使用cython包装器进行链接——这相当稳定,尽管出于安全考虑,每次都会重新编译它。My setup.py被黑客攻击是为了接受一些告诉CMake该做什么的标志
my setup.py中处理CMake部件()的相关代码段如下所示:# ******************************
# CMAKE OPTIONS
# ******************************
# Example using CMake to build static library:
# python setup.py install --cmake-compiler vc9 --cmake-bitness 64
if '--cmake-compiler' in sys.argv:
i = sys.argv.index('--cmake-compiler')
sys.argv.pop(i)
cmake_compiler = sys.argv.pop(i)
else:
cmake_compiler = ''
if '--cmake-bitness' in sys.argv:
i = sys.argv.index('--cmake-bitness')
sys.argv.pop(i)
cmake_bitness = sys.argv.pop(i)
else:
cmake_bitness = ''
USING_CMAKE = cmake_compiler or cmake_bitness
cmake_config_args = []
cmake_build_args = ['--config','"Release"']
STATIC_LIBRARY_BUILT = False
if USING_CMAKE:
# Always force build since any changes in the C++ files will not force a rebuild
touch('CoolProp/CoolProp.pyx')
if 'clean' in sys.argv:
if os.path.exists('cmake_build'):
print('removing cmake_build folder...')
shutil.rmtree('cmake_build')
print('removed.')
if cmake_compiler == 'vc9':
if cmake_bitness == '32':
generator = ['-G','"Visual Studio 9 2008"']
elif cmake_bitness == '64':
generator = ['-G','"Visual Studio 9 2008 Win64"']
else:
raise ValueError('cmake_bitness must be either 32 or 64; got ' + cmake_bitness)
elif cmake_compiler == 'vc10':
if cmake_bitness == '32':
generator = ['-G','"Visual Studio 10 2010"']
elif cmake_bitness == '64':
generator = ['-G','"Visual Studio 10 2010 Win64"']
else:
raise ValueError('cmake_bitness must be either 32 or 64; got ' + cmake_bitness)
else:
raise ValueError('cmake_compiler [' + cmake_compiler + '] is invalid')
cmake_build_dir = os.path.join('cmake_build', '{compiler}-{bitness}bit'.format(compiler=cmake_compiler, bitness=cmake_bitness))
if not os.path.exists(cmake_build_dir):
os.makedirs(cmake_build_dir)
subprocess.check_call(' '.join(['cmake','../../../..','-DCOOLPROP_STATIC_LIBRARY=ON']+generator+cmake_config_args), shell = True, stdout = sys.stdout, stderr = sys.stderr, cwd = cmake_build_dir)
subprocess.check_call(' '.join(['cmake','--build', '.']+cmake_build_args), shell = True, stdout = sys.stdout, stderr = sys.stderr, cwd = cmake_build_dir)
# Now find the static library that we just built
if sys.platform == 'win32':
static_libs = []
for search_suffix in ['Release/*.lib','Release/*.a', 'Debug/*.lib', 'Debug/*.a']:
static_libs += glob.glob(os.path.join(cmake_build_dir,search_suffix))
if len(static_libs) != 1:
raise ValueError("Found more than one static library using CMake build. Found: "+str(static_libs))
else:
STATIC_LIBRARY_BUILT = True
static_library_path = os.path.dirname(static_libs[0])
你确定它在重建吗
python setup.py--help build
显示了“forcably build(忽略时间戳)”的一个-f
选项,如果这是默认行为,它似乎不应该存在…@mgilson它正在挑战性地重建一切。可能是setup.py
脚本本身中的某个设置?虽然,如果它在那里,我找不到它…谢谢你的回答!但我更关注的是:如何调整Python2.7 distutils以覆盖默认情况下重建所有.o文件的新“无缺陷”方式。是否有一个选项标志我可以传递,或者我必须深入代码以使代码不重新编译所有代码文件来创建新的.o文件?好吧,我的意思是告诉您不能这样做,您不应该尝试这样做,因为我提到的问题。