我试图从IPython shell导入模块(venues
)。 venues
模块已正确导入,但它会尝试自行导入名为makesoup
的模块,但无法执行此操作。
我位于~
目录中,正在尝试导入位于子目录venues.py
中的processors
文件。 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'
我在 __init__.py
和~
目录中添加了空processors
,但未成功。
注意:{I}位于makesoup
时,processors
模块已正确导入,但我知道这不是它应该工作的唯一方式。
答案 0 :(得分:30)
makesoup.py
文件也位于processors
子目录中,这意味着它附近的任何Python脚本都应该可以找到它,对吗?
没有。此功能was changed in Python 3和该语法不再有效。
将import makesoup
更改为此:
from . import makesoup
或者对此:
from processors import makesoup
这两种情况都会导致无法直接运行python processors/venues.py
,但您仍然可以从主目录中执行python -m processors.venues
。
答案 1 :(得分:1)
有时候,这不起作用:
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)
这两种方式适用于小型项目。如果您的项目既复杂又庞大,我建议您选择第一个。