Python 3:与脚本位于同一目录中的模块:";ImportError:没有名为“的模块”;

Python 3:与脚本位于同一目录中的模块:";ImportError:没有名为“的模块”;,python,python-3.x,Python,Python 3.x,我正在尝试从IPython shell导入模块(场馆)。场馆模块已正确导入,但它随后尝试导入名为makesoup的模块,但未能导入 我位于~目录中,正在尝试导入位于子目录processors中的Vincements.py文件。makesoup.py文件也位于processors子目录中,这意味着它附近的任何Python脚本都应该能够找到它,对吗 In [1]: import processors.venues -------------------------------------------

我正在尝试从IPython shell导入模块(
场馆
)。
场馆
模块已正确导入,但它随后尝试导入名为
makesoup
的模块,但未能导入

我位于
~
目录中,正在尝试导入位于子目录
processors
中的
Vincements.py
文件。
makesoup.py
文件也位于
processors
子目录中,这意味着它附近的任何Python脚本都应该能够找到它,对吗

In [1]: import processors.venues
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-765135ed9288> in <module>()
----> 1 import processors.venues

~/processors/venues.py in <module>()
      7 """
      8 
----> 9 import makesoup
     10 import re
     11 

ImportError: No module named 'makesoup'
[1]中的
:导入处理器
---------------------------------------------------------------------------
ImportError回溯(最近一次呼叫最后一次)
在()
---->1.场地
()
7 """
8.
---->9进口肉汤
10进口稀土
11
ImportError:没有名为“makesoup”的模块
我在
~
处理器
目录中都添加了一个空的
\uuu init\uuuuuuuuuuuuuuuupy
,未成功

注意:
makesoup
模块在我位于
处理器
时正确导入,但我知道这不是它工作的唯一方式

makesoup.py
文件也位于
processors
子目录中,这意味着它附近的任何Python脚本都应该能够找到它,对吗

In [1]: import processors.venues
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-765135ed9288> in <module>()
----> 1 import processors.venues

~/processors/venues.py in <module>()
      7 """
      8 
----> 9 import makesoup
     10 import re
     11 

ImportError: No module named 'makesoup'
不会。此功能和该语法不再有效

导入makesoup
更改为:

from . import makesoup
或为此:

from processors import makesoup

这两种情况都会导致无法直接运行
python处理器/vinces.py
,尽管您仍然可以从主目录执行
python-m处理器.vinces

有时,这不起作用:

from . import xxx
也许有人会告诉你在目录下添加init.py。这对某些特殊情况也不起作用

最有用的方法是首先使用以下命令检查sys.path:

import sys
print(sys.path)
然后您可以找到应该从何处导入

还有另一种方法:

import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname("__file__"), '..')))
或者改用插入功能:

sys.path.insert(0, xxx)

这两种方法适用于小型项目。如果您的项目复杂且庞大,我建议您选择第一种方法。

谢谢Kevin。但是,我不明白为什么这些解决方案会导致无法直接运行
Vinces.py
。您能告诉我为什么吗?如果您使用显式相对导入(我列出的第一个选项),则必须设置
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
魔术变量,但是在没有
-m
的情况下直接运行脚本时,
python
不会这样做。如果使用绝对导入,python可能无法找到
处理器
包,因为它与脚本不在同一目录中。同样,
-m
将修复此问题s、 在使用Python 3时,我也没有意识到这一变化。如果您只想从文件中导入函数,请尝试此
from。makesoup导入此函数
答案应使用@blaylockbk comment进行编辑。这对我很有用。请注意,如果您只想从
makesoup
导入单个符号,可以使用:
from.makesoup从\u makesoup导入符号\u