PyCharm项目文件夹recs出现ModuleNotFoundError错误

Dna*_*iel 12 python python-import

我正在PyCharm开展一个项目.该项目具有以下结构:

/projectRoot/
   folder1/
       somecode.py
   utils/
       __init__.py
       myutils1.py
Run Code Online (Sandbox Code Playgroud)

我想知道如何进行导入,以便在以交互方式在pyCharm控制台中运行代码时导入工作,以及在使用

python somecode.py 
Run Code Online (Sandbox Code Playgroud)

终端中的命令.

目前我这样做:

from utils.myutils1.py import myClass

但命令行我得到错误:

来自utils.myutils1的文件"somecode.py",第10行,导入myClass ModuleNotFoundError:没有名为'utils'的模块

并在PyCharm上:

回溯(最近一次调用最后一次):文件"/home/ubuntu/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py",第2881行,在run_code exec中(code_obj,self.user_global_ns,self .user_ns)文件"",第1行,来自utils.myutils1,导入myClass ModuleNotFoundError:没有名为'utils'的模块

有关项目中模块的正确文件夹结构的任何建议,以及如何正确导入它们?

谢谢!

Tar*_*ani 23

为了解释答案,我重新创建了你的项目结构

/projectRoot/
   folder1/
       somecode.py
   utils/
       __init__.py
       myutils1.py
Run Code Online (Sandbox Code Playgroud)

somecode.py

from utils.myutils1 import myclass

if __name__ == "__main__":
   print(myclass)
Run Code Online (Sandbox Code Playgroud)

myutils1.py

myclass="tarun"
Run Code Online (Sandbox Code Playgroud)

从pycharm运行它们没有任何问题,但从终端运行它们将产生以下错误

  File "somecode.py", line XX, in <module>
    from utils.myutils1 import myclass
ModuleNotFoundError: No module named 'utils'
Run Code Online (Sandbox Code Playgroud)

问题是Pycharm为你做的事情很少,因为你没有意识到为什么它不在终端中工作.所以在告诉你需要什么之前,我会告诉你PyCharm自己做的两件事.

Python控制台

当您从Pycharm启动Python控制台时,会使用首选项执行一些代码.

Python控制台

如您所见,有两种选择

[X] Add content roots to PYTHONPATH
[ ] Add source roots to PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

然后是一个起始脚本.所以它的作用是将项目的根添加到python的路径中.这是由两种主要方式sys.pathPYTHONPATH环境变量控制的

如果我在Python控制台中运行以下代码

>>> import sys
>>> sys.path
['/Applications/PyCharm.app/Contents/helpers/pydev', 
'/Applications/PyCharm.app/Contents/helpers/pydev', 
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python27.zip', 
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7', ....
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages', 
'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27']
Run Code Online (Sandbox Code Playgroud)

如您所见'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27',添加到Python终端.

Python配置

当您使用Pycharm在代码中配置为RUN时,您有两个类似的选项.

运行配置

我们可以somecode.py将下面的代码更改为

import os
print (os.environ['PYTHONPATH'])

import sys
print (sys.path)

/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27
['/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27/folder1', 
'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27', ....,
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages']
Run Code Online (Sandbox Code Playgroud)

从输出中我们可以看到PYTHONPATH设置为当前项目文件夹.

从终端运行

现在让somecode.py我们通过我们所做的修改来运行终端.

$ python somecode.py
Traceback (most recent call last):
  File "somecode.py", line 2, in <module>
    print (os.environ['PYTHONPATH'])
  File "/Users/tarun.lalwani/.virtualenvs/folderstructure27/bin/../lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
KeyError: 'PYTHONPATH'
Run Code Online (Sandbox Code Playgroud)

这表明PYTHONPATH我们在终端运行它时没有.让我们通过删除print(os.environ['PYTHONPATH'])代码再次运行它.您将获得以下输出

['/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27/folder1', ...
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages']
Traceback (most recent call last):
  File "somecode.py", line 7, in <module>
    from utils.myutils1 import myclass
ImportError: No module named utils.myutils1
Run Code Online (Sandbox Code Playgroud)

正如您所看到folder1的那样,sys.path因为它是包含的文件夹somecode.py,但尚未添加根文件夹.终端中的修复很简单,即在PYTHONPATH中设置根目录路径.

PYTHONPATH=`pwd`/.. python somcode.py
Run Code Online (Sandbox Code Playgroud)

现在代码也可以在终端上运行.

但它们的工作方式与Python控制台不同.

重要说明: Python控制台在远程解释器上使用PyCharm.

如果使用远程解释器选项运行python控制台选项pycharm将失败.这是因为它将附加本地PC的路径而不是远程服务器的路径.为了解决这个问题,必须在本地PC目录和远程服务器路径之间添加映射. pycharmRemoteConfig pycharmRemoteConfig2

  • 很好的例子说明。这应该是公认的答案 (2认同)