繁体   English   中英

(又一个)“导入错误:没有名为 my_module 的模块”

[英](Yet Another) 'ImportError: No module named my_module'

好的,我将代码剥离到极小,以说明问题并使其可重现

语境 :

  • 蟒蛇 3.7
  • 没有 VENV 或有趣的东西

谈话很便宜。 给你看代码:

代码结构:

$ tree pymod/
pymod/
├── modone
│   ├── __init__.py
│   └── one.py
└── modtwo
    ├── __init__.py
    └── two.py

init.py无处不在,显然

一个.py:

from modtwo import two
class One():
    @staticmethod
    def print_one():
        print("this is one")
        two.print_two()

if __name__ == "__main__":
    One().print_one()

二.py:

class Two():
    @staticmethod
    def print_two():
        print("this is from two")

抛出错误

$ python modone/one.py

Traceback (most recent call last):
  File "modone/one.py", line 1, in <module>
    from modtwo import two
  ImportError: No module named modtwo

到目前为止我尝试过的:

  • 将所有可能的目录附加到 PYTHONPATH
  • 从项目根目录和相对路径运行命令
  • 强迫性地挠我的头

回答后编辑:

到目前为止我学到了什么:

  • 模块和脚本是两个不同的概念。 它们就像光波/粒子二元性
    因此,它们应该被这样调用/处理(作为模块或脚本)

  • 模块可以作为脚本运行,但它不会知道它周围的目录结构

一旦你有一个类似包的目录结构,运行带有-m选项的 python 以将模块作为脚本运行:

python -m modone.one

您的 one.py 中也有一个错误。 您在导入的模块上调用print_two ,而不是在模块内的类上调用。

问题在于您如何调用 print_two 方法。 你叫了两个,这是一个模块,这就是为什么你得到“模块不可调用”

from modtwo import two
class One():
    @staticmethod
    def print_one():
        print("this is one")
        two().print_two()

你应该先访问这个类

from modtwo import two
class One():
    @staticmethod
    def print_one():
        print("this is one")
        two.Two.print_two()

并像这样运行脚本

python -m modone.one

结果是:

this is one
this is from two

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM