2017-11-21 16 views

답변

1

거기, as shown by another 대답 공식 스펙/문서의 일부가 아닌, 그리고 이후 sysconfig/distutils.sysconfig.get_config_var()의 적절한 변수가 설정되지 않은 경우, 모든 경우에 안정적으로 얻을 수있는 유일한 방법은

입니다. , 정확히을 빌드 (예 : sourcetree에있는 Python의 경우에도) 참조 구현에 위임하는 것입니다.

distutils에서 컴파일러의 라이브러리 경로를 설정하는 논리는 is located in distutils.commands.build_ext.finalize_options()입니다. 그래서,이 코드는 빌드에 아무런 부작용을 얻을 것입니다 :

import distutils.command.build_ext #imports distutils.core, too 
d = distutils.core.Distribution() 
b = distutils.command.build_ext.build_ext(d) #or `d.get_command_class('build_ext')(d)', 
               # then it's enough to import distutils.core 
b.finalize_options() 
print b.library_dirs 

참고 :

  • 이 결과 목록에서 모든 위치가 반드시 존재하지 않습니다.
  • setup.pysetuptools 인 경우 이에 상응하여 setuptools.Distributionsetuptools.command.build_ext을 사용하십시오.
  • 결과에 영향을 미치는 setup()에 값을 전달하면 여기에 Distribution으로 전달해야합니다.

보장 당신이 통과해야하는 추가 값의 집합이 동일하게 유지됩니다, 또는 다음 테이너가 1 다른 빌더로 전환되지 않습니다 없기 때문에; 확장을 만들 때와 값 만

  • 당신이 정말이 값을 얻을 안된다 것 같다 독립적으로 전혀 필요하다 :
    • 다른 빌드 기능을 사용하는 경우, 오히려 build_ext을 서브 클래스 화하고 빌드하는 동안 기본 메소드에서 값을 가져와야합니다.

1 좋아, 특정 하나가 아닌 원격 가능성

이다 인정
0

다음은 실행중인 Python에 대해 libpythonxx.so/pythonxx.lib을 찾습니다 (약간 긴) subroutine in skbuild.cmaker입니다. CMake에서는 350 라인의 Modules/FindPythonLibs.cmake이이 작업에 사용됩니다.

단지 디렉토리를 가져 그 이전의 일부하지만 훨씬 간단합니다 :

libdir = dustutils.sysconfig.get_config_var('LIBDIR') 
if sysconfig.get_config_var('MULTIARCH'): 
    masd = sysconfig.get_config_var('multiarchsubdir') 
    if masd: 
     if masd.startswith(os.sep): 
      masd = masd[len(os.sep):] 
     libdir = os.path.join(libdir, masd) 

if libdir is None: 
    libdir = os.path.abspath(os.path.join(
     sysconfig.get_config_var('LIBDEST'), "..", "libs")) 

def get_python_library(python_version): 
    """Get path to the python library associated with the current python 
    interpreter.""" 
    # determine direct path to libpython 
    python_library = sysconfig.get_config_var('LIBRARY') 

    # if static (or nonexistent), try to find a suitable dynamic libpython 
    if (python_library is None or 
      os.path.splitext(python_library)[1][-2:] == '.a'): 

     candidate_lib_prefixes = ['', 'lib'] 

     candidate_extensions = ['.lib', '.so', '.a'] 
     if sysconfig.get_config_var('WITH_DYLD'): 
      candidate_extensions.insert(0, '.dylib') 

     candidate_versions = [python_version] 
     if python_version: 
      candidate_versions.append('') 
      candidate_versions.insert(
       0, "".join(python_version.split(".")[:2])) 

     abiflags = getattr(sys, 'abiflags', '') 
     candidate_abiflags = [abiflags] 
     if abiflags: 
      candidate_abiflags.append('') 

     # Ensure the value injected by virtualenv is 
     # returned on windows. 
     # Because calling `sysconfig.get_config_var('multiarchsubdir')` 
     # returns an empty string on Linux, `du_sysconfig` is only used to 
     # get the value of `LIBDIR`. 
     libdir = du_sysconfig.get_config_var('LIBDIR') 
     if sysconfig.get_config_var('MULTIARCH'): 
      masd = sysconfig.get_config_var('multiarchsubdir') 
      if masd: 
       if masd.startswith(os.sep): 
        masd = masd[len(os.sep):] 
       libdir = os.path.join(libdir, masd) 

     if libdir is None: 
      libdir = os.path.abspath(os.path.join(
       sysconfig.get_config_var('LIBDEST'), "..", "libs")) 

     candidates = (
      os.path.join(
       libdir, 
       ''.join((pre, 'python', ver, abi, ext)) 
      ) 
      for (pre, ext, ver, abi) in itertools.product(
       candidate_lib_prefixes, 
       candidate_extensions, 
       candidate_versions, 
       candidate_abiflags 
      ) 
     ) 

     for candidate in candidates: 
      if os.path.exists(candidate): 
       # we found a (likely alternate) libpython 
       python_library = candidate 
       break 

    # TODO(opadron): what happens if we don't find a libpython? 

    return python_library