木兰编程语言不同运行版本的 Python sys.path 差异小结
上文中的两个问题之一,是发布到 PyPI 的版本在运行时有个测试未通过:测试/引用/引用本地包内py.ul
,而开发版和木兰原始可执行文件是通过的。
由于这是第一次发觉 PyPI 发布版本的行为差异,于是优先研究。
问题描述
测试源码如下:
using test.package.module_py test.package.module_py.talk()
在项目根目录下(后文如无特别说明,命令运行都在根目录下),有如下测试包结构:
- test
- package
- module_py.py
- package
- test_module_py.py <--- 该模块在根目录下
开发版如下运行测试无误:
$ python3 -m 木兰 测试/引用/引用本地包内py.ul
但如果安装在 PyPI 的发布版,再如下运行相同测试用例则报错(见此 issue):
$ 木兰 测试/引用/引用本地包内py.ul 没找到模块:‘test.package’ 调用层级如下 见第1行:using test.package.module_py
但是,发布版如下引用当前目录下的模块并无问题:
using test_module_py test_module_py.talk()
为何?
调查过程
由于木兰原始可执行文件运行该测试无误,于是首先对木兰重现项目用 PyInstaller 生成(参考前文)exe 文件进行测试,引用并无问题。
由于无头绪,建立最简项目重现问题,再次确认当前运行目录需添加到 sys.path 才能引用当前目录下的模块 test_module_py(在此前的 commit 中实现)。接下去围绕 sys.path 做一系列测试。
期间试着将 test 目录改名为 tes,结果引用成功。又直接使用__import__('test')
,才发现在 Python3 的包路径中,原就存在一个 test 包。
结论
sys.path 在不同运行版本的区别如下:
- PyPI 发布版:虽然添加了运行当前目录到 sys.path,但位于末尾。在 sys.path 中更靠前的路径中包含 Python3 的包路径,其中恰好存在其他 test 包,而且该包中没有 package 子目录,因而报错。
- exe 发布版(用 PyInstaller 生成):sys.path 中不包含 Python3 的包路径,因而不会认错 test 包。
- 开发版:运行的当前目录位于 sys.path 第一个。sys.path 中虽也包含 Python3 的包路径,但由于顺序靠后,并不起作用,因而不认错 test 包。
由此来看重现项目两种发布版的优劣势:
- PyPI 发布版:由于自带 Python3 包路径,那么只要是当前 Python3 环境下可用的包,木兰即可引用。副效应就是万一碰到上面这样的同名包,会优先引用 Python3 自带包,而 Python 的行为是优先引用自定义包。
- exe 发布版:由于不带 Python3 包路径,木兰将不能引用 Python3 环境下安装的包。当然也就没有同名包的优先问题。但如果用户自行配置了环境变量,使得系统路径中包含 Python3 的包路径,是否会有同样问题尚待确认。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Git for Windows 2.30.0 发布
Git for Windows 2.30.0现已发布,主要更新内容如下: New Features 随附Git v2.30.0 随附OpenSSL v1.1.1i 随附cURL v7.74.0 随附Git LFS v2.13.1 Bug 修复 现在,auto-updater会在安装时显示进度。 credential-helper selector(Windows Git 便携式版本中的默认 credential helper)现在可以正确处理带空格的路径。 更新说明:https://github.com/git-for-windows/git/releases/tag/v2.30.0.windows.1
- 下一篇
Qt 6 for Python 发布
Qt 6 for Python 发布了。此发行版中,也包括 PySide6 和 Shiboken6 的更新。 主要更新包括: 支持 Python 3.9,并将最低支持版本提高到 3.6。 在代码库中执行“Python 2 exorcism”,删除了该语言不推荐使用的版本。 用户可以使用 Python 语言的一些出色功能,例如 f-strings,数字文字下划线,变量注释语法等。 PySide6: PySide最初针对 Qt 4 发布,PySide2 针对 Qt 5.12 发布。此版本遵循一般的 Qt 发行版本号。 Qt 6.0 支持直接从 Python 代码访问 Qt 属性,而无需使用 setters 和 getters,就可以使用新true_property功能。 Shiboken6: 删除了未使用的功能。 重新构建内部流程,比如与 ApiExtractor 或 CppGenerator 的交互。 对于绑定生成,在类型系统中添加更多选项,如允许选择要在子程序中使用的函数重载顺序。 在 C++ 对绑定生成的支持上,改进了与 smart pointers 的交互。 更新详情:https:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装