Python 如何访问由setuptools安装的模块';在setup.py中安装\u需要什么?

Python 如何访问由setuptools安装的模块';在setup.py中安装\u需要什么?,python,installation,setuptools,setup.py,pkg-resources,Python,Installation,Setuptools,Setup.py,Pkg Resources,我正在编写一个setup.py来安装我的包rebombx,它有一个依赖项rebomb。我的软件包构建了一个扩展名librebrank.so,该扩展名需要链接到setup.py中的librebrank.so rebxExt = Extension('libreboundx', libraries=['rebound'], library_dirs = [rebound_path]...) 我希望能够在设置(…)调用中使用install\u requires来构建rebombx模块,以确保安装了正

我正在编写一个setup.py来安装我的包
rebombx
,它有一个依赖项
rebomb
。我的软件包构建了一个扩展名
librebrank.so
,该扩展名需要链接到setup.py中的
librebrank.so

rebxExt = Extension('libreboundx', libraries=['rebound'], library_dirs = [rebound_path]...)
我希望能够在
设置(…)
调用中使用
install\u requires
来构建
rebombx
模块,以确保安装了正确版本的
rebomb
。有没有办法解决这个循环问题

如果未安装
respond
,我将需要setuptools通过
install\u requires
、安装
respond
、然后找到正确的路径并构建扩展名
libresponbx.so

(如果您喜欢这种方法,我可以进一步阐述) 考虑这个例子。我使用ctypes加载共享库。然后使用函数调用获取库的版本

>>> import ctypes
>>> x = ctypes.cdll.LoadLibrary("libc.so.6")
>>> x.gnu_get_libc_version
<_FuncPtr object at 0x7f9a08e3e460>
>>> getversion = x.gnu_get_libc_version
>>> getversion.restype = ctypes.c_char_p
>>> getversion()
'2.19'
>>导入ctypes
>>>x=ctypes.cdll.LoadLibrary(“libc.so.6”)
>>>x.gnu_get_libc_版本
>>>getversion=x.gnu\u get\u libc\u版本
>>>getversion.restype=ctypes.c\u char\p
>>>getversion()
'2.19'
你可以用回弹做类似的事情。使用try语句加载libresponse。 如果版本错误或在库的标准搜索路径中找不到,则编译librespond

#setup.py
import ctypes
try:
    x = ctypes.cdll.LoadLibrary("librebound.so")
    x.restype = ctypes.c_char_p
    version = x.get_version()
    major,minor = version.split(".")
    if int(major) < REQUIRED_VERSION:
        raise False, "LIBREBOUND VERSION %s IS NOT SUPPORTED"%(str(version))

except:
    pass
    #invoke rebound's makefile
    #probably install the new library to lib path.
    #link to new rebound 

rebxExt = Extension('libreboundx', libraries=['rebound'], library_dirs = [rebound_path]...)
#setup.py
导入ctypes
尝试:
x=ctypes.cdll.LoadLibrary(“libresumb.so”)
x、 restype=ctypes.c\u char\p
version=x.get_version()
主版本,次版本=版本拆分(“.”)
如果int(主要)<所需版本:
raise False,“不支持%s版本”%(str(版本))
除:
通过
#调用服务器的makefile
#可能会将新库安装到lib路径。
#链接到新的反弹
rebxExt=Extension('librebombx',libraries=['rebomb'],library\u dirs=[rebomb\u path]…)

您应该使用
setup\u requires
参数来
setup()
。从文件来看

设置\u需要

一个字符串或字符串列表,指定运行安装脚本所需的其他发行版。setuptools将在处理其余的安装脚本或命令之前尝试获取这些(甚至可以使用EasyInstall下载它们)。如果在构建过程中使用distutils扩展,则需要此参数;例如,处理setup()参数并将其转换为EGG-INFO元数据文件的扩展

(注意:setup_requires中列出的项目不会自动安装在运行安装脚本的系统上。如果它们在本地不可用,则只需将它们下载到./.eggs目录。如果希望安装它们,并且在运行安装脚本时可用,则应将它们添加到install_require中。)uires和设置需要。)

编辑: 它应该为
setup\u所需的每个条目创建一个egg目录。然而,我刚刚用response尝试了这一点,它实际上无法在easy install下构建

$> python2 setup.py install
install_dir .
warning: no files found matching 'src/rebound.h'
src/rebound.c:38:21: fatal error: rebound.h: No such file or directory
compilation terminated.
Traceback (most recent call last):
  File "setup.py", line 187, in <module>
    url="http://www.mathics.github.io/",   # project home page, if any
  File "/usr/lib/python2.7/distutils/core.py", line 111, in setup
    _setup_distribution = dist = klass(attrs)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py", line 221, in __init__
    self.fetch_build_eggs(attrs.pop('setup_requires'))
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py", line 245, in fetch_build_eggs
    parse_requirements(requires), installer=self.fetch_build_egg
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/pkg_resources.py", line 544, in resolve
    dist = best[req.key] = env.best_match(req, self, installer)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/pkg_resources.py", line 786, in best_match
    return self.obtain(req, installer) # try and download/install
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/pkg_resources.py", line 798, in obtain
    return installer(requirement)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py", line 293, in fetch_build_egg
    return cmd.easy_install(req)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py", line 582, in easy_install
    return self.install_item(spec, dist.location, tmpdir, deps)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py", line 612, in install_item
    dists = self.install_eggs(spec, download, tmpdir)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py", line 802, in install_eggs
    return self.build_and_install(setup_script, setup_base)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py", line 1079, in build_and_install
    self.run_setup(setup_script, setup_base, args)
  File "/usr/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py", line 1070, in run_setup
    raise DistutilsError("Setup script exited with %s" % (v.args[0],))
distutils.errors.DistutilsError: Setup script exited with error: command 'gcc' failed with exit status 1
$>python2 setup.py安装
安装目录。
警告:找不到与“src/resumb.h”匹配的文件
src/resumb.c:38:21:致命错误:resumb.h:没有这样的文件或目录
编译终止。
回溯(最近一次呼叫最后一次):
文件“setup.py”,第187行,在
url=”http://www.mathics.github.io/“,#项目主页,如有
文件“/usr/lib/python2.7/distutils/core.py”,第111行,在安装程序中
_设置\u分布=dist=klass(属性)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py”,第221行,在__
self.fetch\u build\u鸡蛋(attrs.pop('setup\u requires'))
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py”,第245行,在fetch\u build\u eggs中
解析需求(requires),安装程序=self.fetch\u build\u
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/pkg_resources.py”,第544行,在resolve中
dist=最佳[req.key]=环境最佳匹配(req,self,installer)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/pkg_resources.py”,第786行,最佳匹配
返回self.acquire(请求,安装程序)#尝试下载/安装
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/pkg_resources.py”,第798行,获取
返回安装程序(要求)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/dist.py”,第293行,在fetch\u build\u egg中
return cmd.easy_安装(需要)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py”,第582行,在easy_install中
返回自安装项目(规格、距离位置、tmpdir、deps)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py”,第612行,安装项
dists=self.install_-eggs(规范、下载、tmpdir)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py”,第802行,在install_eggs中
返回self.build\u和安装(安装程序脚本、安装程序库)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py”,第1079行,内置和安装
self.run\u安装程序(安装程序脚本、安装程序库、参数)
文件“/usr/lib/python2.7/site packages/distribute-0.6.14-py2.7.egg/setuptools/command/easy_install.py”,第1070行,在run_安装程序中
raise DistutilsError(“安装程序脚本退出时带有%s”%(v.args[0],))
distutils.errors.DistutilsError:安装程序脚本退出,出现错误:命令“gcc”失败,退出状态为1

正如sn6uv所指出的,似乎setuptools确实通过
setup\u requires
关键字实现了这一点。然而,我发现很难找到说明如何使用它的文档和/或示例。从我的发现来看,对于新手来说,它似乎也有点微妙/复杂