【问题标题】:How to package shared objects that python modules depend on?如何打包python模块依赖的共享对象?
【发布时间】:2013-07-03 07:30:43
【问题描述】:

我有一个用 C++ 实现的 python 包,我正在使用 setuptools 分发它。我的 C++ 代码依赖于一些共享对象,特别是 boost.python 库。我应该如何分发这些共享对象?目前,我要求软件包用户单独安装 boost C++ 库,但我宁愿将所有内容捆绑在一个 setuptools 发行版中,以使他/她更容易。目前,除了安装我的包之外,他们还必须设置 boost 库及其 LD_LIBRARY_PATH 环境变量。

【问题讨论】:

  • 您是否尝试过将您的依赖项静态链接到您的 Python 共享对象中?当然,您需要为此获取依赖项的静态库。
  • 我确实想过,但由于各种技术原因,有必要在模块之间共享 boost.python 库。

标签: c++ python boost-python


【解决方案1】:

声明依赖

setup.py 中有一个名为 install_requires = [""] 的选项: 例如:

setup(
    name='django-cherrypy',
    version='0.1',
    packages=packages,
    license='LICENSE',
    description='cherrypy, running under django',
    long_description=open('README.md').read(),
    author='Calvin Cheng',
    author_email='calvin@calvinx.com',
    install_requires=['cherrypy-wsgiserver'],
    extra_requires=['newrelic'],
    url='https://github.com/od-eon/django-cherrypy',
)

此设置需要 chrerryPy WSGI 服务器库。

捆绑一切

这里解释了一切:http://pythonhosted.org/distribute/setuptools.html#declaring-dependencies

PiPy 中的依赖关系:

  1. 安装项目时,无论是使用 EasyInstall, setup.py install 或 setup.py develop,所有的依赖都没有 已经安装的将被定位(通过 PyPI)、下载、构建(如果 必要),并安装。
  2. 您项目中的任何脚本都将 安装了用于验证可用性的包装器 在运行时指定依赖项,并确保正确 版本被添加到 sys.path (例如,如果多个版本已经 安装)。
  3. Python Egg 发行版将包含一个元数据文件 列出依赖项

PyPI 中没有的依赖项

如果您的项目依赖于未在 PyPI 中注册的包, 只要它们可用,您仍然可以依赖它们 下载为:

  • 一个鸡蛋,采用标准 distutils sdist 格式,
  • 单个 .py 文件,
  • 或 VCS 存储库(Subversion、Mercurial 或 Git)。您只需在 setup() 的 dependency_links 参数中添加一些 URL。

【讨论】:

  • 我的依赖是一个共享对象,我可以从 C++ 代码而不是另一个 python 包构建。我想我真的需要distribute/setuptools/whatever 来构建我的共享对象(就像我的扩展模块一样)并将它安装在合理的地方。有什么设施可以做到这一点吗?
  • 将手工构建脚本与这些操作自动化(批处理、bjam、cmake 等)捆绑在一起。但是,在 Boost.Python 的情况下,您不需要安装它,只需链接标题,对吗?
  • 我不知道你所说的“链接标题”是什么意思,但在运行时我的 python 扩展会寻找一个 boost.python 共享对象,它最好在某个地方。也许通过“链接标头”,您的意思是将标头放在某处并静态编译 boost.python,从而避免在运行时查找 boost.python 共享对象的需要。这可能有效,但会消除在不同 python 扩展之间共享 boost.python 注册表的可能性。捆绑手工脚本听起来很有希望。我如何告诉 setuptools 呢? setuptools 会将共享对象放在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2017-04-08
  • 1970-01-01
  • 2015-10-28
  • 2019-02-15
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多