Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python2.7中使用distutils进行增量构建? 我使用Python 2.7 ditudil来构建C++库。但是每次我用 python setup.py build_Python_Build_Python 2.7_Distutils_Python 2.6 - Fatal编程技术网

如何在Python2.7中使用distutils进行增量构建? 我使用Python 2.7 ditudil来构建C++库。但是每次我用 python setup.py build

如何在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中被删除。有关详细信息,请参阅。我不知道这是否解决了您的确切问题,但我有一个类似

所有对象文件都将重新生成,即使c++文件没有更改。
我的一位朋友告诉我,Python 2.6不会出现这种情况

我向委员会提出的问题:

  • 有没有办法强制distutils以增量方式构建代码
  • 如果无法增量生成代码,
    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文件?好吧,我的意思是告诉您不能这样做,您不应该尝试这样做,因为我提到的问题。