我试图运行一些python脚本,但是取决于运行它们的位置和方式,它们会因各种错误而失败,并且我无法弄清楚如何纠正导入。
检查哪些包可以从何处导入的正确方法是什么? 现在,我正在调试脚本并添加导入-在我看来,这似乎是一种相当随机的方法。
这是我的文件结构:
Master
├── Testcases
│ ├── ATest.py
│ ├── __init__.py
│ ├── TestLinking.py
├── Handling
│ ├── Classes.py
│ ├── Functions.py
├── __init__.py
├── Database
│ ├── Debug.py
│ ├── ConnectionSupport.py
│ ├── Utils.py
│ ├── Initalisation.py
│ ├── __init__.py
│ ├── Database.py
│ ├── Tests.py
│ ├── TKMenu.py
├── unittests.py
Classes.py
包含多个类:Handling
是其中之一。
工作案例
我可以使用unittests.py
测试所有内容。它是从父文件夹开始的,其行为符合预期。 Database.py
运行正常,所有导入均应正常工作。 __init__.py
非常简单,仅包含from . import Handling
。
unittests.py
:
import Database
from Handling import Classes, Functions
import unittest
import os
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTests(loader.loadTestsFromModule(Database.Tests))
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite)
不起作用
现在我在数据库文件夹中。我正在启动python3 Database.py
,但在第一行代码中却失败了:
import Handling
,并显示错误消息:
Traceback (most recent call last):
File "Database.py", line 1, in <module>
import Handling
ModuleNotFoundError: No module named 'Handling'
返回到从那里执行根文件夹的结果相同。
在此过程中,我遇到了类似的错误,因此我尝试添加__init.py__
中所需的所有内容:
import Handling
import Testcases
from . import Debug
from . import ConnectionSupport
from . import Utils
from . import Database
from . import Tests
from . import Initalisation
from . import TKMenu
经过一些研究,我希望可以通过从Database.py
导入同级目录来解决该问题:
from .. import Handling
但这只会给我一个更加不透明的错误:
ValueError: attempted relative import beyond top-level package
from .. Handling import Handling
之类的其他选项也会出现相同的错误。
百感交集
TKMenu.py
是Database.py
的图形界面。我目前正在使用以下导入来使其工作(在其文件夹中运行TKMenu):
try:
from Database.Database import Database #When called from the unittests we arrive here
except ModuleNotFoundError:
import Database #Opening it in its folder
它正在工作,但是我对它的工作方式不满意。而且,它仍然会失败,因为它到达Database.py
的第1行。但是从Unittests运行它就可以了。
我想知道如何找到适当的解决方案。有没有一种方法可以调试从哪个时间点可用的软件包,或者我可以以适当的方式导入父文件夹?