首页 > 解决方案 > 从 CLI 运行时出现 Python“ModuleNotFound”错误,但在“pip install -e”之后从 Pycharm 运行时不会出现错误。”(使用 Anaconda)

问题描述

tldr:我可以从 Pycharm 运行我的脚本,但不能从命令行运行。pip install -e .该模块是通过(使用时我的模块显示在我的包中)安装在 Anaconda中的conda listsys.path当我从 Pycharm 和命令行运行它时,可以找到模块目录,但是PYTHONPATH当我从 Pycharm 而不是 CLI 运行它时,它包含我的模块路径。我试图避免走黑客路线并将我的脚本添加到PYTHONPATH.

更长的版本

我有一个 python 项目,其目录结构如下:

project1/
    mycode/
    __init__.py
        code/
        __init__.py
        simulation/
            __init__.py
            print_path.py

我试图从命令行运行python print_path.py但它没有运行并引发关于 ModuleNotFound 错误的异常。奇怪的是,当我从 PyCharm 运行它时,我得到了预期的行为并且它运行了。我正在使用 Anaconda3 和 python3.7。我通过运行 pip 将我的代码安装为打包模块pip install -e .

路径print_path.pyC:\Users\axk\Documents\Work\project1\my_code\code\simulation

conda list通过查看我在那里看到我的包的位置,我检查了我的包是否在我的环境包中。

这里是内容print_path.py

import os
import sys

try:
    print("Attempting to print paths")
    print()
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
    print(user_paths)
except KeyError as e:
    print("there was an error: {}".format(e))
    user_paths = []

try:
    print()
    print("SYS.PATH")
    for path in sys.path:
        print(path)
except KeyError as e:
    print("there was an error: {}".format(e))

import code.simulation
print("made it past import")
print(code.simulation.__file__)

这将打印 sys.path 的内容以及内容PYTHONPATH

从 pycharm 运行时,以下是我的输出:

Attempting to print paths

['C:\\Users\\axk\\Documents\\Work\\project1\\my_code',
 'C:\\Users\\axk\\Documents\\Work\\project1\\my_code\\code']

SYS.PATH
C:\Users\axk\Documents\Work\project1\my_code\code\simulation
C:\Users\axk\Documents\Work\project1\my_code
C:\Users\axk\Documents\Work\project1\my_code\code
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\python37.zip
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\DLLs
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code
C:\Users\axk\AppData\Roaming\Python\Python37\site-packages
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\win32
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\win32\lib
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\Pythonwin
made it past import
C:\Users\axk\Documents\Work\project1\my_code\code\simulation\__init__.py

当我从命令行运行它时,python print_path.py我得到

Attempting to print paths

there was an error: 'PYTHONPATH'

SYS.PATH
C:\Users\axk\Documents\Work\project1\my_code\code\simulation
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\python37.zip
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\DLLs
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code
C:\Users\axk\AppData\Roaming\Python\Python37\site-packages
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages
c:\users\axk\documents\work\project1\my_code
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\win32
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\win32\lib
C:\Users\axk\AppData\Local\Continuum\anaconda3\envs\my_code\lib\site-packages\Pythonwin
Traceback (most recent call last):
  File "print_path.py", line 21, in <module>
    import code.simulation
ModuleNotFoundError: No module named 'code.simulation'; 'code' is not a package

没有任何意义的是,当我导入我的文件时,它会在C:\Users\axk\Documents\Work\project1\my_code\code\simulation\__init__.py. sys.path当我从 Pycharm 和命令行运行它时,这条路径就存在。

我让它从命令行工作的唯一方法是将脚本添加到 PYTHONPATH 中。但是从 python 文档中,它应该找到它,因为它应该检查 sys.path 的包。那么为什么这不起作用呢?


编辑

好的,这里有些奇怪。如果我这样做from code import *,代码将继续。不知道为什么会这样,因为每个模块都有一个__init__.py文件

标签: python

解决方案


推荐阅读