使用python -m执行模块时无法导入已安装点式Python包求助
核心原因
当你用python -m执行模块时,Python会将当前工作目录(也就是你执行命令时的src目录)加入模块搜索路径的最前端。此时,Python会优先加载本地src目录下的com包,而这个本地com包的ziath子包只包含你项目的ritrack模块,并不包含通过pip安装的acacus和driver子包——这就导致了导入失败。
而直接运行脚本时,Python的模块搜索路径第一个元素是脚本所在的目录(src/com/ziath/ritrack/manu),本地的com包不在搜索路径里,Python会直接从site-packages(pip安装包的位置)加载完整的com.ziath包,所以能正常导入。
解决方法
方法1:将你的项目包安装到site-packages
在项目根目录(C:\Users\nbenn\GitHub\RITrackManu)创建一个setup.py,内容如下:
from setuptools import setup, find_packages setup( name='com.ziath.ritrack', version='0.1', packages=find_packages('src'), package_dir={'': 'src'}, install_requires=['com.ziath.acacus', 'com.ziath.driver'], python_requires='>=3.7' )
然后执行命令:
pip install -e .
这会把你的项目包以可编辑模式安装到site-packages,此时com.ziath包会整合acacus、driver和ritrack三个子包,用python -m执行时就能正常找到依赖了。
方法2:临时调整模块搜索路径
在RITrackManu.py的最开头添加以下代码,强制让Python优先从site-packages加载com包:
import sys # 移除当前工作目录(src)的搜索优先级 if sys.path[0] == 'C:\\Users\\nbenn\\GitHub\\RITrackManu\\src': sys.path.pop(0)
这种方法比较临时,适合快速测试,但不推荐作为长期解决方案。
方法3:避免包名冲突
如果可能,调整你的项目包结构,不要和已安装的包共用com.ziath根路径。比如把项目包名改成com.ziathritrack,这样就不会和com.ziath.acacus、com.ziath.driver产生路径冲突。
内容的提问来源于stack exchange,提问作者Neil Benn

