C++开发(五)
内容提要
本文讨论了C++和Python开发中的细节,包括pytest中的conftest.py文件作用、import语句注意事项、pip和python setup.py命令的使用方法、高级功能和选项,以及构建目录和相对导入。
延伸解读
pip 与 setup.py install 的关键差异
文章对比了 pip install . 和 python setup.py install 两种安装方式。pip 会自动管理依赖、优先使用 wheel 包、在隔离环境中构建,并自动安装 setuptools 和 wheel;而 setup.py install 不会管理依赖、直接从源码构建、无隔离环境,且官方已建议逐步弃用。对于需要可靠依赖管理和环境隔离的项目,pip 是更稳妥的选择。
Cython 构建的实用技巧
文章指出 Cython 构建在 Windows 下容易遇到 Numpy 头文件导入问题,直接使用 cythonize 或重写 build_ext 的 run 方法都可能出错。作者建议在 ext_modules 中只放置 Cython 模块,重写 build_ext 后调用 super().run() 确保其正常构建,其他模块则通过 cmake 手动构建且不放入 ext_modules。构建产物可直接放入 package_data,无需手动修改 RECORD 文件。
相对导入的适用范围
文章强调 Python 的相对导入仅支持同一大包下的模块或子包之间的导入,不支持跨外部包的相对导入。这意味着在使用相对导入时,必须确保导入双方位于同一个顶层包内,否则会引发错误。这一限制在组织大型项目结构时需要特别注意。
Q&A
pytest中的conftest.py文件有什么作用?
pytest中的conftest.py文件在tests目录下的作用类似于GoogleTest中的夹具,所有的test_xx.py文件在执行前会先运行这个文件。
Python的import语句有什么注意事项?
Python的import语句要求导入的模块或包必须实际存在,不能仅仅导入命名空间。
pip如何管理依赖关系?
pip会自动管理依赖关系,确保在安装包之前安装所有依赖项,并优先使用已构建好的wheel文件进行安装。
直接使用python setup.py install有什么缺点?
直接调用setup.py的install命令不会管理依赖项,且安装速度较慢,不在隔离环境中运行,可能导致依赖项冲突。
如何使用--inplace选项构建Cython模块?
使用--inplace选项可以将生成的Cython模块直接放在源代码目录中,命令为python setup.py build_ext --inplace。
Python的相对导入有什么限制?
Python的相对导入仅支持同一大包下的模块间导入,不支持外部包间的相对导入。