首页 > 解决方案 > 用于 include_dir 的 distutils 通配符条目

问题描述

我正在使用 distutils 设置一个包。

我需要允许访问在设置过程中构建并位于./build/temp.linux-x86_64-3.6. 我通过包括

include_dirs=["./build/temp.linux-x86_64-3.6"]

将扩展添加到 distutils 配置时。

我的问题是有一种方法可以使用通配符进行设置,例如:

include_dirs=["./build/temp.linux*"]

当我尝试这个失败时,引用错误:

Nonexistent include directory ‘build/temp.linux*’ [-Wmissing-include-dirs]

我想要这个的原因是构建文件夹将根据系统的不同命名。或者,如果有人知道一种方法来确定这个临时构建文件夹将被称为什么也可以。

标签: pythonwildcardpackagingdistutils

解决方案


我解决这个问题的方法如下:

def return_major_minor_python():

    import sys

    return str(sys.version_info[0])+"."+str(sys.version_info[1])


def return_include_dir():
    from distutils.util import get_platform
    return get_platform()+'-'+return_major_minor_python()

然后在调用时config.add_extension()使用:

include_dirs=['build/temp.' + return_include_dir()]

因此,将 f90wrapped、f2py 扩展添加到 python 包的整个过程是:

def setup_fort_ext(args,parent_package='',top_path=''):
    from numpy.distutils.misc_util import Configuration
    from os.path import join
    import sys

    config = Configuration('',parent_package,top_path)
    fort_src = [join('PackageName/','fortran_source.f90')]

    config.add_library('_fortran_source', sources=fort_src,
                         extra_f90_compile_args = [ args["compile_args"]],
                        extra_link_args=[args["link_args"]])

    sources = [join('PackageName','f90wrap_fortran_source.f90')]

    config.add_extension(name='_fortran_source',
                      sources=sources,
                      extra_f90_compile_args = [ args["compile_args"]],
                      extra_link_args=[args["link_args"]],
                      libraries=['_tort'],
                      include_dirs=['build/temp.' + return_include_dir()])

    return config

if __name__ == '__main__':
    import sys
    import subprocess
    import os

    install_numpy() #installs numpy 
    install_dependencies() #calls to pip to install any requirements

    from numpy.distutils.core import setup

    config = {'name':'PackageName',
              'version':__version__,
              'project_description':'Some Package description',
              'description':'Some package Description',
              'long_description': open('README.txt').read(),
              'long_description_content_type':'text/markdown',
              'author':'Your name here',
     'author_email':'your email here',
     'url':'link to git repo here',
     'python_requires':'>=3.3',
     'packages':['PackageName'],
     'package_dir':{'PackageName':'PackageName'},
     'package_data':{'PackageName':['*so*']},
     'name': 'PackageName'
      }


    config_fort = setup_fort_ext(args,parent_package='PackageName',top_path='')
    config2 = dict(config,**config_fort.todict())

    setup(**config2)

其中源 fortran_source.f90 被预先包装,生成的包装源文件 ( f90wrap_fortran_source.f90 ) 作为库包含,随后由 f2py 编译。

上面的 args 只是一个包含您希望通过的任何链接或编译 args 的字典。


推荐阅读