解决pycharm终端/cmd运行python脚本报错“ImportError/ModuleNotFoundError:No Module named ...”

问题

项目结构如下:

  • 整个项目名为project
  • package1和package2是项目文件夹下的两个文件夹,即两个包(package)
  • 两个包中分别有__init__.py 和 module1.py / module2.py文件,其中module1.py和module2.py文件为两个模块(module)

(在python中一个文件可以被看成一个独立模块,而对应着文件夹。区别包和文件夹的重要特征就是包文件夹内每一层目录都有初始化文件__init__.py

module1.py中为:

def print_a(a):
    print(a)

module2.py中为:(引入了package1中的module1,module2和module1不在同一包下。程序输出为打印hello world)

from package1 import module1

module1.print_a('hello world')

在Pycharm或IPython之类的IDE上运行脚本正常:

但在pycharm的终端(terminal)或cmd命令行执行python module2.py命令,报了模块未能找到的错误

原因:(不想看可直接跳到解决方法)

Python在启动解释器(Interpreter)时不光会导入环境变量中sys.path发现的模块,还会导入当前工作目录下的模块。

什么是环境变量中sys.path发现的模块当前工作目录下的模块

在module2.py开头加上2行代码:

import sys
print(sys.path)
from package1 import module1

module1.print_a('hello world')

使用  python module2.py  命令在终端运行,得到

红框中的第一个绿线位置就是当前工作目录下的模块,后面的几个则是环境变量中sys.path原本发现的模块。

当你在IDE中启动解释器时,当前的工作目录就是项目目录,能顺利调用同项目中的模块;但是当你通过命令行启动时,当前工作目录为你启动解释器时所在的目录,如果当时的位置不是项目目录,那么项目目录中的模块就不会被找到,因此运行的时候报错:ModuleNotFoundError: No Module named ...(在例子中我的当前目录是.../package2是项目目录底下的一个文件夹,不是项目目录,所以报错)

解决方法:
方法很简单,就是把模块路径提供给解释器:

(推荐) 把模块路径放到环境变量中作为全局变量(sys.path能扫描到)。

在module2.py开头加入sys.path.append('../'):

import sys
sys.path.append('../')  # 新加入的
print(sys.path)
from package1 import module1

module1.print_a('hello world')

sys.path.append()中添加的正是这个项目的项目目录('../'表示当前目录的父目录,也即这个项目的项目目录

随后打印出的结果为:

绿色一行为当前目录,黄色一行为新添加的项目目录。这样就不会再报错了。

或者使用指向项目目录(project)的绝对路径:sys.path.append('D:\\coding\\deep_learning\\adversarial_example\\project'):

import sys
sys.path.append('D:\\coding\\deep_learning\\adversarial_example\\project')
print(sys.path)
from package1 import module1

module1.print_a('hello world')

输出:

同样可以

参考:

  1. http://stackoverflow.com/questions/15514593/importerror-no-module-named-when-trying-to-run-python-script
  2. http://stackoverflow.com/questions/8321130/python-module-import-issues-in-command-prompt
  3. https://www.cnblogs.com/arkenstone/p/5765522.html
  • 41
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值