Force compiler when running python setup.py install

前端 未结 4 1787
后悔当初
后悔当初 2021-02-04 00:40

Is there a way to explicitly force the compiler for building Cython extensions when running python setup.py install? Where setup.py is of the form:

相关标签:
4条回答
  • 2021-02-04 00:52

    Well I found a trick in my case : I wanted to use MSVC14.0 (from buildtools 2015) and NOT MSVC14.1 (buildtools 2017). I edited the file Lib\distutils_msvccompiler.py. There is a method

    _find_vcvarsall 
    

    which is calling

    best_version, best_dir = _find_vc2017()
    

    I replaced this call by

    best_version, best_dir = _find_vc2015()
    

    Do not forget to undo this dirty trick once compiled.

    0 讨论(0)
  • 2021-02-04 01:02

    As a remark: on linux, you can use many of the autoconf environment variables. For the compiler

    CC=mpicc python setup.py build_ext -i
    
    0 讨论(0)
  • 2021-02-04 01:03

    You can provide (default) command line arguments for distutils in a separate file called setup.cfg (placed parallel to your setup.py). See the docs for more information. To set the compiler use something like:

    [build]
    compiler=msvc
    

    Now calling python setup.py build is equivalent to calling python setup.py build --compiler=msvc. (You can still direct distutils to use an other complier by calling python setup.py build --compiler=someothercompiler)

    Now you have (successfully directed distutils to use a msvc compiler. Unfortunately there is no option to tell it which msvc compiler to use. Basically there are two options:

    One: Do nothing and distutils will try to locate vcvarsall.bat and use that to setup an environment. vcvarsall.bat (and the compiler it sets the environment up for) are part of Visual Studio, so you have to have installed that for it to work.

    Two: Install the Windows SDK and tell distutils to use that. Be aware that the name DISUTILS_USE_SDK is rather missleading (at least in my opinion). It does NOT in fact tell distutils to use the SDK (and it's setenv.bat) to setup an environment, rather it means that distutils should assume the environment has already been set up. That is why you have to use some kind of Makefile.bat as you have shown in the OP.

    Side Note: The specific version of VisualStudio or the Windows SDK depends on the targeted python version.

    0 讨论(0)
  • 2021-02-04 01:14

    I ended up putting this at the beginning of setup.py to force visual2015

    useful when running in a non bat environment and starting vcvarsall from outside is not an option

    if sys.platform == 'win32':
        # patch env with vcvarsall.bat from vs2015 (vc14)
        try:
            cmd = '"{}..\\..\\VC\\vcvarsall.bat" x86_amd64 >nul 2>&1 && set'.format(environ['VS140COMNTOOLS'])
            out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, universal_newlines=True)
        except:
            print("Error executing {}".format(cmd))
            raise
    
        for key, _, value in (line.partition('=') for line in out.splitlines()):
            if key and value:
                os.environ[key] = value
    
        # inform setuptools that the env is already set
        os.environ['DISTUTILS_USE_SDK'] = '1'
    
    0 讨论(0)
提交回复
热议问题