【发布时间】:2020-11-30 02:52:41
【问题描述】:
这一定很简单,但我发誓我已经搜索和试验了 2 天,没有出现任何错误。我设法实现的最好的结果是 IDE 指示没有错误,但在运行时失败。或表示错误,但运行成功。我在 Windows 10 上。Python 3.8.3 conda。我有 VS Code、Spyder 和 PyCharm——我已经多次卸载并重新安装了所有这些,希望其中一个能给我有用的默认行为。
我认为我有一个可重现性极低的异常,它有望用于识别问题,我将在下面解释。作为前言,我会说我希望我能找到一个完整而直接的指南来识别、声明、修复等包和模块。我看到的每个来源都有不同的建议集,似乎。我在 PYTHONPATH、sys.path、.env 工作区文件、.vscode json 文件之间迷路了。
c:\myproject
__init__.py
file1.py
\myenums
__init__.py
category.py
functions.py
general.py
这样就省去了很多文件和文件夹。而且我不会详细列出我遇到的各种错误。希望这对例子能说明问题。
我在 \myproject\file1.py 中有一个函数,在 \myproject\myenums\functions.py 中有另一个函数。这些 .py 文件中的每一个都具有对其他 .py 文件的导入引用。几乎所有这些导入语句在 VS Code 中都带有红色下划线。但取决于我如何限定导入语句——我去的文件夹层次结构有多高——一个或另一个将运行,但不能同时运行。即(减少和简化实际代码的指示):
\myproject\file1.py
import myenums.category # red underline for error
import myenums.functions # red underline for error
import myenums.general # red underline for error
import myenums.results # red underline for error
print(myenums.category) # works
print(myenums.functions) # works
print(myenums.general) # works
print(myenums.results) # works
\myproject\myenums\functions.py
from myenums.category import A, B, C # red underline, note mutual parent folder
from myenums.general import X, Y, Z # red underline, note mutual parent folder
def testfunc(value):
if value is A.x:
return X.a
elif value is A.y:
return Y.a
print(testfunc(A.y)) # doesn't work. ModuleNotFoundError: No module named 'myenums'.
我通过在任一文件中运行而不调试来获得工作/不工作结果。
\myproject\file1.py
import myenums.category # red underline for error
import myenums.functions # red underline for error
import myenums.general # red underline for error
import myenums.results # red underline for error
print(myenums.category) # doesn't work, ModuleNotFoundError: No module named 'category' (on import functions)
print(myenums.functions)
print(myenums.general)
print(myenums.results)
\myproject\myenums\functions.py
from category import A, B, C # red underline, note parent folder qualification removed
from general import X, Y, Z # red underline, note parent folder qualification removed
def testfunc(value):
if value is A.x:
return X.a
elif value is A.y:
return Y.a
print(testfunc(A.y)) # Now works!
因此,根据我是否在functions.py 中使用包含文件夹名称的资格过高,我可以让functions.py 或file1.py 运行——但不能同时运行。而且我永远不能让导入时的错误指示消失。
我完全不知道如何诊断这个问题。我是否有太多或错误的 init.py 文件?它们可能是坏文件吗?它们在记事本中看起来是空的。而且不是.py.bin。当我在 sys.path 中运行 print(p) 时,我确实看到了c:\myproject——但它是一个小写的“c”,所有的 Anaconda 引用都有大写的“C”。嗯。很久以来,我一直在尝试编写一些代码时感到迷失和无助。我不会想到在单个文件夹中的文件之间创建引用会是一个如此大的挑战。我不知道该尝试什么。
编辑:最初我认为我的问题是特定于层次结构中彼此相邻的子文件夹之间的引用,我想我会尝试通过重新排列代码以仅引用直接子文件夹来修复它 - 但这个异常似乎拍摄即便如此。另外,我最初发帖说我的异常消失了。现在我认为它仍然存在,我只是有一个错字。
【问题讨论】:
标签: python import module package importerror