调试 Python 导入失败 (ModuleNotFoundError)

AJM*_*ica 5 python windows python-import python-3.x pdb

短的:

我一直在尝试调试ModuleNotFoundError我的本地存储库克隆之一中发生的问题。

更多详情:

我有同一个存储库的两个克隆。目前两者都已签出主分支。我想运行一个 Python 脚本,它导入各种模块,导入其他模块等。在第一个存储库克隆中,我得到ModuleNotFoundError: No module named 'TheModuleInQuestion'. 在第二个克隆中,脚本成功导入了它需要的所有内容并且运行时没有错误 - 尽管 sys.path 不包含特定于存储库的文件夹名称,并且尽管可能导入的所有文件也存在于第一个存储库中。

我想通过观察导入过程、搜索文件夹的顺序以及第二个存储库中导入模块的路径来调试它,最好使用 pdb。我在线查看了 pdb 用户指南,但没有发现与此特定用例相关的内容。我该怎么做呢?

更多信息

我的所有存储库克隆都位于 ~/git 的子文件夹中(或者,因为我在 Windows 10 上使用 Git Bash,所以位于 C:\users\myusername\git)

我使用的是 Python 3.6.5 32 位。这不是最新版本,它是公司出于与某些软件包或其他软件包的兼容性原因而指定的版本。

>>> 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']
Run Code Online (Sandbox Code Playgroud)

得到后

ModuleNotFoundError: No module named 'TheModuleInQuestion'
Run Code Online (Sandbox Code Playgroud)

我已在我的存储库克隆中搜索名称以“TheModuleInQuestion”开头的文件。其中没有“The ModuleInQuestion.py”。各种文件夹包含:

  • 问题模块.dll
  • TheModuleInQuestion.pdb(可能是微软的“程序数据库”格式。我可以将其与其他 pdb 一起添加到标签中。)
  • TheModuleInQuestion.xml
  • TheModuleInQuestion.dll.config
  • TheModuleInQuestion.dll-Help.xml

bru*_*ers 2

Python 模块可以是纯 Python(.py 文件)或二进制 lib 文件(Linux 上的 .so,Windows 上的 .dll),因此您正在寻找的模块很可能是“TheModuleInQuestion.dll”。

wrt/“用 pdb 调试导入过程”,恐怕你不能在这里做太多事情 - pdb 只适用于纯 python 代码,并且所有导入系统都是内置的(python.exe 运行时的一部分) 。

尽管如此,您仍然可以回答两个问题:

搜索文件夹的顺序

就是这样sys.path,很简单。这正是它的定义:搜索文件夹的顺序。FWIW,它包含“没有特定于存储库的文件夹名称”这一事实是正常的和预期的。

以及第二个存储库中导入模块的路径

转到第二个存储库文件夹,打开 python shell 并输入

>>> import TheModuleInQuestion
>>> print(TheModuleInQuestion)
Run Code Online (Sandbox Code Playgroud)

现在,如果两个本地存储库都是同一远程存储库的克隆并且位于同一分支上(它们处于同一修订版吗?),那么它们之间不应该有太大差异。我不知道 Windows 上有哪些可用的比较工具,但我在这里要做的第一件事就是比较存储库。

如果没有明显的结果,我会检查文件和文件夹权限(当然特别是在这个“TheModuleInQuestion.xxx”文件上,而且还会检查通向它的整个路径)。

最后 - 如果没有其他方法解决问题 - 我将制作第三个克隆存储库并对其进行测试(最终测试不同的修订版)。

哦,是的:清理陈旧的 .pyc 文件通常是一个好主意。我不认为它会解决你的情况的任何问题(如果 TheModuleInQuestion 是一个 dll...),但这仍然是一个好主意 - 有时删除的 .py 文件会留下陈旧的 .pyc,然后所有的赌注都消失了;- )