【问题标题】:Use Setuptools with C Extension as part of package使用带有 C 扩展的 Setuptools 作为包的一部分
【发布时间】:2018-05-10 18:02:18
【问题描述】:

我编写了一个 C 扩展来从专有库访问相机的错误消息。结构是

setup.py
dicamsdk\
|---__init__.py
|---control.py
|---pcoError.c

setup.py

from setuptools import setup, Extension, find_packages
from dicamsdk.control import __version__

pcoErrorModule = Extension("dicamsdk.pcoError",
                           sources=["dicamsdk/pcoError.c"],
                           include_dirs=['C:\Program Files (x86)'
                                         '\Digital Camera Toolbox'
                                         '\Sensicam SDK\include'],
                           define_macros=[("PCO_ERRT_H_CREATE_OBJECT", None)],
                           )
setup(
    name="pydicamsdk",
    platforms=["win-amd64", 'win32'],
    license="GNU GPLv3",
    ext_modules=[pcoErrorModule],
    packages=find_packages(),
    version=__version__
)

control.py 打算导入已编译的 C 扩展与

from . import pcoError

当我尝试构建(或安装)包时,我总是收到错误ImportError: cannot import name 'pcoError'

似乎唯一可行的方法是注释掉control.py 中的导入并使用setup.py build_ext --inplace 构建C 扩展。只需使用已编译的礼物,我就可以构建/安装我的库。

在我的setup.py 中是否有解决方案可以首先编译我的扩展以实现简单安装?

【问题讨论】:

  • S.O.是很棒的。其他人和你有同样问题的几率是多少,对吧?

标签: python c setuptools packaging python-extensions


【解决方案1】:

问题在于setup.py 开头的导入。第 2 行 (from dicamsdk.control import __version__) 中的导入强制对模块进行代码检查。

删除后,软件包的安装或构建将正确运行。

【讨论】:

    【解决方案2】:

    根据你自己的答案,一个更合适的解决方案:

    您的版本可能适用于整个项目,而不仅仅是控制模块。在__init__.py 中定义__version__ 是标准的。在这种情况下,您在setup.py 中的导入看起来像from dicamsdk import __version__。这不会导致冲突,除非你做了一些愚蠢的事情,比如从包根目录自动导入所有模块。

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2012-04-09
      • 2018-12-29
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多