一个奇怪的“没有名为“ XX”的模块”问题

时间:2019-02-11 14:08:00

标签: python

我知道如何导入软件包或模块,但是遇到一个很奇怪的问题。

如果我运行swmm5_extend_function/example.py,一切都很好。但是,当我运行example.py时,会发生错误:

Traceback (most recent call last):   
File "example.py", line 2, in <module>
    from swmm5_extend_function.Swmm5Extend import SWMM5ReadInp   
File "C:\project\swmm5_extend_function\Swmm5Extend.py", line 1, in <module>
    import swig.SWMM5ReadInpFile as swmm 
ModuleNotFoundError: No module named 'swig'

这是我的项目结构:

project/     
-- example.py   
-- ......   
-- swmm5_extend_function/  
      -- __init__.py
      -- example.py
      -- Swmm5Extend.py
      -- swig/
           -- __init__.py
           -- SWMM5ReadInpFile.py
           -- ....

以下是每个.py文件的代码:

swmm5_extend_function / Swmm5Extend.py

import swig.SWMM5ReadInpFile as swmm

class SWMM5ReadInp(object):
    pass

swmm5_extend_function / example.py

from Swmm5Extend import SWMM5ReadInp

example.py

from swmm5_extend_function.Swmm5Extend import SWMM5ReadInp

我想知道为什么会发生这种奇怪的错误。

1 个答案:

答案 0 :(得分:0)

为得到更好的解释,我创建了以下文件夹结构:

test/     
-- __init__.py
-- greeter.py # Greets in German
-- subfolder/  
    -- __init__.py
    -- greeter.py # Greets in Italian
    -- test.py
    -- deepfolder/
        -- __init__.py
        -- greeter.py # Greets in France

您可能会注意到,我们有3个具有相同名称的文件,每个文件都使用具有相同名称的函数以不同的语言表示欢迎。 greeter.py文件中的唯一功能是:

def says():
    print("Hello World!")

从同一文件夹导入
如果从test.py文件中导入greeter并运行says函数,则将具有:

import greeter as greeter

greeter.says()

输出:

Buongiorno Mondo! # Italian output

从子公司导入
但是,如果要从子文件夹导入怎么办?
要从子文件夹(即deepfolder/)导入,我们只需在文件夹中添加一个空的__init__.py文件,然后我们可以在导入中指定路径:

import deepfolder.greeter as greeter

greeter.says()

输出:

Bonjour le Monde! # France output

从父文件夹导入
最后,您可能要从父文件夹导入。
您应该尝试将main运行文件放在文件夹树的顶部,但是事情发生了,您发现自己希望从父文件夹导入模块。
为此,您需要将父文件夹添加到sys.path:

import sys
sys.path.append("/path/to/dir")
from test import greeter as greeter

greeter.says()

输出:

Guten Morgen Welt! # German output

导入脚本和模块并不是解决问题的最Python方法,您可能想看看Python's documentation about packages

TL; DR
在您的project/example.py中使用

import swmm5_extend_function.swig.SWMM5ReadInpFile as swmm

代替

import swig.SWMM5ReadInpFile as swmm