Short:
我一直在尝试调试一个发生在我的一个本地repo克隆中的ModuleNotFoundError
更多详细信息:
我有两个相同回购协议的克隆。目前,两家公司都已将主分支机构签出。我想运行一个Python脚本,它导入各种模块,导入其他模块,等等。在第一个repo克隆中,我得到ModuleNotFoundError: No module named 'TheModuleInQuestion'
。在第二个克隆中,脚本成功导入了它所需的所有内容,并且运行时没有错误—尽管sys.path不包含任何特定于repo的文件夹名,并且尽管可能要导入的所有文件也存在于第一个repo中
我希望通过观察导入过程、搜索文件夹的顺序以及第二个repo中导入模块的路径来调试它,最好是使用pdb。我已经在线查看了pdb用户指南,但没有发现与此特定用例相关的内容。我该怎么做呢
更多信息
我的所有repo克隆都位于~/git的子文件夹中(或者,因为我在Windows 10上使用的是git Bash,C:\users\myusername\git)
我使用的是32位Python 3.6.5。这不是最新的版本,这是该公司出于与某些软件包或其他软件包兼容的原因指定的版本
>>> import sys
>>> sys.path
['', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'c:\\users\\myusername\\downloads\\pyopenssl-master\\src']
得到
ModuleNotFoundError: No module named 'TheModuleInQuestion'
我已经在我的repo克隆中搜索了名称以“TheModuleInQuestion”开头的文件。其中任何一个中都没有“moduleinquest.py”。各种文件夹包含:
Python模块可以是纯Python(.py文件)或二进制lib文件(.so在linux上,.dll在Windows上),因此您要查找的模块可能是“TheModuleInQuestion.dll”
wrt/“用pdb调试导入过程”,恐怕您在这里做不了什么-pdb只在纯python代码上工作,而且所有导入系统都是内置的(python.exe运行时的一部分)
尽管如此,您仍然可以回答两个问题:
这很简单。这正是它定义的:搜索文件夹的顺序。FWIW,它包含“没有特定于回购协议的文件夹名”这一事实是正常的,也是意料之中的
转到第二个repo文件夹,打开pythonshell并键入
现在,如果两个本地回购协议都是同一远程协议的克隆,并且位于同一分支上(它们是否处于同一版本?),那么它们之间应该没有太大差异。我不知道Windows上有什么不同的工具,但我在这里要做的第一件事是不同的回购协议
如果没有明显的结果,我会检查文件和文件夹的权限(当然,特别是在这个“TheModuleInQuestion.xxx”文件上,但也在通向它的整个路径上)
最后,如果没有其他办法解决这个问题,我会制作第三个克隆repo并对其进行测试(最终测试不同的版本)
哦,是的:清理陈旧的.pyc文件通常是个好主意。我认为在您的情况下,它不会解决任何问题(如果所讨论的模块是一个dll…),但这仍然是一个好主意-有时删除的.py文件会留下一个过时的.pyc,然后所有的赌注都被取消;-)
相关问题 更多 >
编程相关推荐