无法导入软件包,具体取决于启动脚本的方式和位置

时间:2019-04-18 12:22:11

标签: python python-3.x package python-import python-module

我试图运行一些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.pyDatabase.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运行它就可以了。

我想知道如何找到适当的解决方案。有没有一种方法可以调试从哪个时间点可用的软件包,或者我可以以适当的方式导入父文件夹?

0 个答案:

没有答案
相关问题