【问题标题】:Is there a way to version a Python C extension?有没有办法对 Python C 扩展进行版本控制?
【发布时间】:2020-12-05 01:29:34
【问题描述】:

我有一个 python3 发行版,它有一个包和一个 C 扩展。我希望能够在 tell.py 脚本中的导入期间指定 C 扩展的版本,但似乎无法弄清楚。

我的目录结构如下:

funnyjoke/
├── tell.py
├── funnyjoke
    └── __init__.py
└── src
    └── fastjoke.c

我可以完美导入funnyjoke模块的特定版本:

__requires__= 'funnyjoke==0.3'
import pkg_resources
pkg_resources.require("funnyjoke==0.3")
import funnyjoke
funnyjoke.tell()

但是 fastjoke 扩展没有从setup.py 脚本中获取版本

__requires__= 'fastjoke==0.3'
import pkg_resources
pkg_resources.require("fastjoke==0.3")
import fastjoke
fastjoke.tell()

并给出错误:

pkg_resources.DistributionNotFound: The 'fastjoke==0.3' distribution was not found and is required by the application

是否可以为 C 扩展设置/附加一个版本?


setup.py

from setuptools import setup, Extension, find_packages

setup(name='funnyjoke',
      version='0.3',
      description='The funniest joke in the world',
      author='Flying Circus',
      license='MIT',
      #packages=['funnyjoke'],
      packages=find_packages(),
      scripts=['tell.py'],
      ext_modules = [Extension('fastjoke', ['src/fastjoke.c'])],
      zip_safe=False)

所有文件也可以通过pip3 install funnyjoke检索

【问题讨论】:

  • 嗨,不确定,也许将其附加到共享库前缀?
  • 我有同样的想法,并尝试了各种尝试/黑客向共享库添加版本。有各种各样的陷阱,比如distutils 将句点视为folder separators,它也不喜欢下划线或破折号。我什至尝试安装后重命名共享库,但它只会带来更多的错误。

标签: python cpython python-extensions


【解决方案1】:

我发现需要在 setup.py 中将根包名(funnyjoke)添加到扩展名(fastjoke)中:

...
ext_modules = [Extension('funnyjoke.fastjoke', ['src/fastjoke.c'])],
...

然后我可以导入/要求根包名,然后导入相关的 C 扩展:

>>> __requires__= 'funnyjoke==0.4' ; import pkg_resources ; pkg_resources.require("funnyjoke==0.4")
>>> import funnyjoke
>>> funnyjoke.tell()
Wenn ist das Nunstück git und Slotermeyer? Ja! ... Beiherhund das Oder die Flipperwaldt gersput.
>>> import funnyjoke.fastjoke
>>> funnyjoke.fastjoke.tell()
Wenn ist das Nunstück git und Slotermeyer? Ja! ... Beiherhund das Oder die Flipperwaldt gersput.

同样(我不得不退出 IDE,因为我无法卸载 0.4 版本):

>>> __requires__= 'funnyjoke==0.5' ; import pkg_resources ; pkg_resources.require("funnyjoke==0.5")
>>> import funnyjoke
>>> funnyjoke.tell()
A man walks into a bar
>>> import funnyjoke.fastjoke
>>> funnyjoke.fastjoke.tell()
A man walks into a bar

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多