最近,我发现使用“ import M”和“ from。import M”时出现奇怪的错误。我正在使用python3.6。
例如,文档树如下。
test/
├── pacA
│ ├── a1.py
│ ├── a2.py
│ └── utils.py
├── test_a1.py
└── test_a2.py
在utils.py中是func打印机:
def printer(info):
print(info)
在a1.py中是:
from .utils import printer
def pa():
printer('printer called in a1.pa()\n')
if __name__ == '__main__':
printer('pinter called in a1.__main__\n')
在a2.py中是:
from utils import printer
def pa():
printer('printer called in a2.pa()\n')
if __name__ == '__main__':
printer('pinter called in a2.__main__\n')
我们可以看到a1.py和a2.py都希望在utils.py中导入打印机。他们正在使用不同的导入方法。这是唯一的区别。
无论我是否从目录pacA /运行a1.py,都会收到以下错误消息:
from .utils import printer
ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package
但是运行a2.py将获得正确的答案。
但是,如果我使用另一个.py导入a1和a2,情况就会好转。在test_a1.py中,代码如下:
from pacA import a1
if __name__ == '__main__':
a1.pa()
在test_a2.py中,代码如下:
from pacA import a2
if __name__ == '__main__':
a2.pa()
无论是否通过test /运行test_a1.py,我都会得到正确的答案。但是,当我运行test_a2.py时,出现如下错误:
from pacA import a2
File "/home/gph/Desktop/test/pacA/a2.py", line 1, in <module>
from utils import printer
ModuleNotFoundError: No module named 'utils'
如何在a1中导入utils.py以使两种情况都正确?
答案 0 :(得分:0)
尝试这个
pip install utils
python希望您从外部安装utils软件包
希望这会有所帮助
答案 1 :(得分:0)
我想我已经找到了背后的原因。
对于第一个错误,我认为不直接运行a1.py。
在a1.py中使用相对导入from .utils import printer
时,不应直接运行a1.py。如果是这样,您将得到错误'__main__' is not a package"
。要了解这一点,您需要了解if __name__==__main__
的工作方式。
在a2.py中使用from utils import printer
时,python将搜索经典路径,包括sys.path中的路径。但是,如果您运行test_a2.py,则不包含pacA,因此我们找不到它。如果要运行test.a2.py,则应在导入utils之前包含此sys.path.append('path to pacA')
。