python - 用于 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]
我想要这个的原因是构建文件夹将根据系统的不同命名。或者,如果有人知道一种方法来确定这个临时构建文件夹将被称为什么也可以。
解决方案
我解决这个问题的方法如下:
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 的字典。
推荐阅读
- javascript - 为什么 EJS 会在 forEach 循环的每次迭代之间生成空格?
- .net - .Net核心外部登录在chrome上不起作用
- flutter - 在 dart 中动态定义或转换变量类型
- python - 如何禁用无头 chrome 中的弹出窗口?
- php - Bootstrap 模态表单不会在提交时关闭
- sql - MS Access DoCmd.CopyObject 将表从另一个数据库复制到当前数据库
- maven - Maven同时执行目标
- sql-server - 如何对 SSAS 多维数据集中的时间维度进行排序?糟糕的排序导致 ParallelPeriod() 出现问题
- pine-script - 绘制多个图,有些是叠加的,有些不是
- python - 将项目附加到Python中列表的所有子列表