【问题标题】:Python ImportError: No module named 'requests' after confirming installPython ImportError:确认安装后没有名为“请求”的模块
【发布时间】:2019-08-19 15:42:47
【问题描述】:

我是 python 新手,在终端中设置了一些东西,现在正尝试在 Atom 中运行 python 代码。

我的代码编辑器中的前三行是:

import re
import requests
import robobrowser

当我运行代码时,我不断得到

ImportError: 没有名为 robobrowser 的模块

我假设它与我的文件的路径或位置有关,但我不确定如何检查。

我在终端中运行的版本:

(prot) MacBook:prot myname$ python --version
Python 3.7.3
(prot) MacBook:prot myname$ pip --version
pip 19.0.3 from /Users/myname/prot/prot/lib/python3.7/site- 
packages/pip (python 3.7)

我还使用以下内容创建了一个虚拟环境:

MacBook:prot myname$ python3 -m venv prot
MacBook:prot myname$ source prot/bin/activate

所以我的默认命令行显示:

(prot) MacBook:prot myname$

运行以下显示所需的包在那里。

(prot) MacBook:prot myname$ pip3 list
Package        Version 
-------------- --------
beautifulsoup4 4.7.1   
certifi        2019.3.9
chardet        3.0.4   
idna           2.8     
pip            19.0.3  
requests       2.21.0  
robobrowser    0.5.3   
setuptools     40.8.0  
six            1.12.0  
soupsieve      1.9     
urllib3        1.24.1  
Werkzeug       0.15.1

编辑(根据 cmets 更新):

import sys
print(sys.version)

在 Atom 输出中(以前说 2.#,所以我更新了 atom 中的版本):

3.7.3(默认,2019 年 3 月 27 日,09:23:15)

[GCC 4.2.1 兼容 Apple LLVM 10.0.0 (clang-1000.0.42)]

Robobrowser 正确显示在终端中:

(prot) MacBook:prot myname$ pip3 show robobrowser
Name: robobrowser
Version: 0.5.3
Summary: Your friendly neighborhood web scraper
Home-page: https://github.com/jmcarp/robobrowser
Author: Joshua Carp
Author-email: jm.carp@gmail.com
License: MIT
Location: /Users/myname/prot/prot/lib/python3.7/site-packages
Requires: beautifulsoup4, requests, six, Werkzeug
Required-by: 

为了检查剩余的 robobrowser 问题,我在 atom 中运行了这个:

from pip import _internal
_internal.main(['list'])

得到了这个(注意缺少robobrowser):

Package         Version 
--------------- --------
cached-property 1.5.1   
certifi         2019.3.9
chardet         3.0.4   
idna            2.8     
pip             19.0.3   
python-dateutil 2.8.0   
requests        2.21.0  
setuptools      40.8.0  
six             1.12.0  
urllib3         1.24.1  
wheel           0.33.1  

在终端中,运行

pip show requests
pip show robobrowser

返回相同的位置

/Users/myname/prot/prot/lib/python3.7/site-packages

在原子中,运行

import sys
print(sys.path)

输出

['', '/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7. 3/Frameworks/Python.framework/Versions/3.7/lib/python3.7'、'/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib -dynload', '/usr/local/lib/python3.7/site-packages']

所以我想我需要将上述位置添加到 sys.path

【问题讨论】:

  • 你用什么命令来创建你的 virtualenv?您是否明确使用了-p python3?您确定 virtualenv 中的 python 解释器指向正确的解释器吗?您可以单独导入它们吗(例如从 IDLE 解释器)?你用什么命令来启动你的脚本?
  • 我编辑了我的帖子来回答你的第一个问题。我不确定如何判断解释器是否指向正确的东西或如何使用 IDLE。为了运行脚本,我在 Atom 中下载了一个名为 Script 的包并在其中运行它,而不是使用终端。
  • 更新:我在 Atom 中配置了脚本以使用 python3,并且我通过了代码中的“导入请求”行。 'import robobrowser' 仍然存在问题。
  • @hansence:试试from robobrowser import RoboBrowser
  • 试过了,得到一个 ModuleNotFoundError: No module named 'robobrowser' 错误

标签: python importerror


【解决方案1】:

问题:ImportError: No module named 'robobrowser'

运行以下命令,验证是否可以找到module已安装,并且Locationsys.path 中。

import sys
import pkg_resources as pkg

sys_path = sys.path
ws_entries = pkg.WorkingSet().entries

print('Python    :{}'.format(sys.version.split('\n')[0]))

key = 'robobrowser'    

key_found = False
for dist in pkg.working_set:        
    if key in dist.key:
        key_found = True
        print('Package   :{}'.format(dist.project_name))
        print('Version   :{}'.format(dist.version))
        print('Location  :{}'.format(dist.location))

        importable = False
        for info in pkg.find_distributions(dist.location, only=True):
            if key in info.key:
                importable = True
                break

        if importable:
            print('Importable: Location were on sys.path')
        else:
            print('Not importable: Unless {} were added to sys.path.'.format(dist.location))

        print('sys.path  :{}'.format(dist.location in sys_path))
        print('WorkingSet.entries:{}'.format(dist.location in ws_entries))
else:
    if not key_found:
        print("No package like '{}' found.".format(key))

输出:示例key = 'requests'

Python    : 3.5.3 (default, Jan 19 2017, 14:11:04) 
Package   : requests
Version   : 2.19.1
Location  : /usr/local/lib/python3.5/dist-packages
Importable: Location were on sys.path
sys.path  : True
WorkingSet.entries: True

【讨论】:

  • @hansence:是的,beautifulsoup4/Werkzeug 也不见了。将pip show requests 中的Locationpip show robobrowser 中的进行比较。然后验证这个Location 是否在sys.path 中。如果不使用sys.path.append(... 添加它
  • 我在终端签入时请求和 robobrowser 的位置相同。我在 sys.path 中没有看到该位置,因此我正在尝试使用该附加命令。
  • 我检查了那个线程。运行“pip3 list --local”会返回与“pip3 list”相同的列表,但是当我在 atom 中运行“internal list”代码时,项目会丢失。我只是在想,如果这是问题所在,那么导入请求会引发错误,但现在不再是了。我认为 robobrowser 在错误的位置,但我在设置我的 venv 后安装了它......我可以尝试简单的卸载并重新安装 - 这也不起作用
  • @hansence:删除输出,一点用处都没有。 dists = [d for d in pkg.working_set] 似乎还没有完成。应该是:sys.path.append('/Users/myname/prot/prot/lib/python3.7/site-packages')
【解决方案2】:

我解决了这个问题,但不确定我是否以正确的方式解决了问题。我退出了 venv 并回到了我的主目录。安装 robobrowser 然后回到我正在使用的特定 venv/目录。这解决了我的问题。

【讨论】:

  • pip3 show robobrowser 的输出是否变化,Location 不同?
  • 我有相同的位置输出/Users/myname/prot/prot/lib/python3.7/site-packages
  • print(sys.path)_internal.main(['list']) 有变化吗?
  • 我认为当我之后在 atom 中运行后者时,robobrowser 确实出现在列表中。昨天我在上面工作了几个小时,有一次我遇到了新的错误,所以我退出了 prot venv 并重新开始了一个新的 venv,这样我就有了一张白纸。我再次安装了所有东西,并从 github 克隆了一个 zip,在我一个接一个地复制文件之前。我的文件结构与我的第二个 venv 不同,事情运行得更加顺畅。我认为我的第一次尝试时我的 python 文件级别太高了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多