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

2024-04-26 08:54:10 发布

您现在位置: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\扩展\功能/swmm5扩展.py你知道吗

import swig.SWMM5ReadInpFile as swmm

class SWMM5ReadInp(object):
    pass

swmm5\扩展\功能/示例.py你知道吗

from Swmm5Extend import SWMM5ReadInp

你知道吗示例.py你知道吗

from swmm5_extend_function.Swmm5Extend import SWMM5ReadInp

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


Tags: frompyimportexample错误linefunctionfile
1条回答
网友
1楼 · 发布于 2024-04-26 08:54:10

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

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运行的文件位于文件夹树的顶部,但是发生了一些事情,您发现自己正在从父文件夹导入模块。
为此,需要将父文件夹添加到搜索路径地址:

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

greeter.says()

输出:

Guten Morgen Welt! # German output

导入脚本和模块并不是解决问题的最佳方式,您可能想看看Python's documentation about packages。你知道吗

TL;DR
project/example.py中使用

import swmm5_extend_function.swig.SWMM5ReadInpFile as swmm

而不是

import swig.SWMM5ReadInpFile as swmm

相关问题 更多 >