我知道如何导入软件包或模块,但是遇到一个很奇怪的问题。
如果我运行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
我想知道为什么会发生这种奇怪的错误。
答案 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