【问题标题】:How to install dynamic library using setup.py?如何使用 setup.py 安装动态库?
【发布时间】:2021-06-14 00:42:19
【问题描述】:

我想分发一个具有闭源依赖的 Python 包。我正在使用 setup.py,如果我也使用 setup.py 进行编译,一切正常。

this question 的答案和that question 的答案都不能解决我的问题。

我的文件结构如下:

.
├── closed_source
│   ├── compiled.so
├── python_modules
│   ├── file1.py
│   ├── file2.py
│   ├── ...
│   └── __init__.py
└── setup.py

我还尝试将compiled.so 包含在python_modules 中。在file1.py 我使用import compiled 失败。

以下工作,但默默地未能包含动态库:

setup(
    name='my_package',
    version=0.1,
    packages=['python_modules'],
    package_dir={'python_modules': 'python_modules'},
    package_data={'': ['closed_source/compiled.so']}, # also tried using key compiled
    include_package_data=True,
)

【问题讨论】:

  • 您是否尝试将compiled.so 放入python_modules 文件夹中?
  • 是的,我试过了。
  • 你的导入不正确,如果包含在包内,应该是from python_modules import compiled
  • @AnthonySottile 是的,这行得通。在将compiled.so 放入python_modules 文件夹后,我使用了import python_modules.compiled as compiled

标签: python setuptools setup.py


【解决方案1】:

您必须vendor 依赖项。最简单的方法是将依赖项inside 你的 python 包,而不是外部。

setuptools 要求您包含一个 MANIFEST.in 文件以在您的发行版中包含非包、非 python 文件。

请参阅 this 项目以获取有关如何执行此操作的示例。

您的项目结构应如下所示:

my_package
|-- vendor
    |-- compiled.so
|-- __init__.py
|-- file1.py
|-- file2.py
setup.py

您还需要使用附加的相对前缀导入您的供应商库

from .vendor import compiled

【讨论】:

  • 完美,有效。它实际上可以在没有 Manifest.in 文件的情况下工作。
  • @Niki setuptools 可能会将您的文件扩展名识别为包文件。对于txt、jpg、json等资源文件,一般默认是不会抓取的。
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多