模块安装返回ModuleNotFoundError

问题描述

我正在使用virtualenvwrapper来管理一个我目前仅在运行该项目的项目

import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions

with beam.Pipeline(options=PipelineOptions()) as p:
    pass

这将返回以下错误

Traceback (most recent call last):
  File "path/to/pipeline.py",line 1,in <module>
    import apache_beam as beam
ModuleNotFoundError: No module named 'apache_beam'

我已经跑过pip install apache-beam。运行pip list返回

➜ pip list  
Package                        Version
------------------------------ ---------
apache-beam                    2.23.0
avro-python3                   1.9.2.1
...

我将按照类似的question中的建议添加以下输出

pip freeze

➜ pip freeze
apache-beam==2.23.0
avro-python3==1.9.2.1
...

pip -V

➜ pip -V    
pip 20.2.2 from /Users/miguel/.virtualenvs/myenv/lib/python3.7/site-packages/pip (python 3.7)

python -V

➜ python -V        
Python 3.7.3

which python

➜ which python
/Users/miguel/.virtualenvs/myenv/bin/python

which pip

➜ which pip   
/Users/miguel/.virtualenvs/myenv/bin/pip

我不知道这是否相关,但是我使用的是VSCode,并且我已根据VSCode指令here选择了python解释器。另外,我按照here的说明安装了python。

知道为什么会这样吗?

解决方法

首先测试您安装的Python模块是否在VSCode之类的工具之外运行。 我们可以通过打开终端/命令提示符并激活我们的虚拟环境来做到这一点。在这种情况下,当您使用 virtualenvwrapper 时,您需要使用以下命令:

workon myenv

virtualenvwrapper 的文档可以在here中找到。激活后,我们可以使用以下命令在终端中打开Python解释器:

python

一旦运行,请尝试使用以下方式导入apache_beam:

import apache_beam as beam

如果这行得通,我们现在知道这是使用VSCode的虚拟环境设置问题。要在VSCode中为Python设置虚拟环境,请使用官方文档Using Python environments in VS Code。这应该允许您指定虚拟环境。

如果此操作无效,另一个选择是在VSCode中创建新的虚拟环境并安装模块。在您的帖子linked的VSCode说明中可以找到在VSCode中将模块安装到环境的方法。

我尝试使用以下方法重新创建您的问题:

  • Python 3.7.7
  • VSCode 1.48.0
  • apache-beam 2.23.0

我的虚拟环境被命名为“堆栈”。创建它后,我安装的唯一模块是使用以下命令的apache-beam:

pip install apache-beam

创建项目时,我创建目录并使用以下命令通过终端启动

 - mkdir hello
 - cd hello
 - code .

然后通过命令添加Python解释器:

Python: Select Interpreter

我需要执行的另一步骤(因为我通常在Python中使用PyCharm):

Shell Command: Install 'code' command in PATH** command.

允许通过终端启动代码。下面是执行这些步骤并运行与问题中所发布的命令相同的命令以供参考的项目屏幕截图。

enter image description here

我的.vscode / settings.json如下:

{
    "python.pythonPath": "/Users/robertyoung/envs/stack/bin/python"
}