组织、构建和分发PythonCython混合包的演示。

CyPkgDemo的Python项目详细描述


CyPkgDemo

CyPkgDemo 是一个以 Cython - Python 联合编译、包装发布为背景的 Demo 包。

使用方法

  • 可以通过 pip install CyPkgDemo 将 CyPkgDemo 安装至 "root" package 下(建议使用虚拟环境), 在文件中使用常规方式 import cypkgdemo 引用即可。

  • 可以下载源文件,使用 python setup.py install 安装。

说明

项目中的 setup.py 是主要内容,其中包含了如何为每一个 .pyx 文件构造 Extension 的方法(通用可移 植),还有一些包命名时的注意事项。

如果获取了源发行包(source distribution),可以运行 test.py 进行测试。注意,如果要从源发行包的根 目录运行,必须先执行 python setup.py build_ext --inplace 生成链接库,否则会报出 ImportError (这是由于 python 在解析模块导入位置的时候,会遵循如下顺序:

  1. built-ins

  2. sys.path

    1. 脚本执行的位置,即当前路径;

    2. 环境变量中的 PYTHONPATH,即 .bash_profile;

    3. 安装 python 时的依赖位置。

故源发行包目录下的 cypkgdemo (没有生成链接库文件)会覆盖可能已安装至 site-packages 的 cypkgdemo, 从而抛出 ImportError)。另一种解决方案是切换至源发行包目录外的位置执行 setup.py

开发的一般步骤

一般而言,对于一个包含了多个 Python 和 Cython 源文件的项目,每个模块在导入同一项目下的其他模块时,都 应当采用相对于最顶层包的绝对路径(例如,在这里就是 from cypkgdemo.atoi import / cimport ...)。

若只有纯 Python 文件,最顶层包在源文件夹中的名字和安装后的包名可以不相同,例如在源项目中,cypkgdemo 文件夹可以改名为 src, 同时须在 setup.py 中为 setup() 指定 package_dir={cypkgdemo: src}。 若还包含 Cython 文件,则二者名字应当一致。

在编写完源代码后,先运行 python setup.py build_ext --inplace,这样便可方便在项目目录下直接进行 测试,测试时按照 from cypkgdemo.atoi import ... 的方式导入模块即可。

在进行安装测试时,运行 python setup.py install --record ./record.txt,或者直接运行 pip install .,此时上一步测试前 build_ext 得到的链接库文件不会被包含进安装目录。

采用以下步骤上传至 PyPI(同样,build_ext --inplace 得到的链接库文件不会被包含):

pythonsetup.pysdistbdist_wheeltwineupload--repository-urlhttps://test.pypi.org/legacy/dist/*# Upload to Test PyPI# twine upload dist/*  # To PyPI

注意,如果是发布源文件(python setup.py sdist),开发者应当安装有 Cython,以便使生成的 C 文件包含 进源发行包中(这样用户可以不用安装有 Cython)。

采用以下方式安装之前上传的包:

python3-mpipinstall--index-urlhttps://test.pypi.org/simple/CyPkgDemo# From Test PyPI# pip install CyPkgDemo  # From PyPI

注意第一种方式会将当前目录导入 sys.path,所以若是在项目根目录(setup.py 所在的那一层)运行安装代码, 则应将其改为 pip install ...,否则会提示 "Requirement already satisfied"。或者换到项目外运行 安装代码(原理同上)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaSpring框架的用途   java为什么Jersey不尊重动态绑定过滤器中的优先级?   java定位小程序按钮   为什么我的Java数学错了?   JAVAlang.NullPointerException:org。openqa。硒。OutputType),因为“屏幕截图”为空   Java URL无法获取整个源代码   模式匹配如何使用java查找行中的给定字符串   java如何使用JFileChooser通过连接文件名来打开文件   在C++中等价于java的非法语言   Docker容器中的java Apache Karaf 4调试   Java打印字符串数组的数组列表   actionscript 3 Java连接到FMS   java无法使用firestore回收器适配器从firestore获取数据获取空的回收器视图