缺少pip.req模块

74

我正在安装tweepy,但遇到pip.req的错误。 我已经安装了pip,但由于某些原因,仍然找不到pip.req。 我在网上做了大量的研究,发现最多的问题是Zapo(?)和Python 2.7之间的不兼容性导致其他用户遇到了同样的错误。 然而,对于如何解决这个问题,讨论并不清楚。谢谢!

$ python2 setup.py install
Traceback (most recent call last):
  File "setup.py", line 5, in <module>
    from pip.req import parse_requirements
ImportError: No module named pip.req

看起来他们想要移除它。我不完全同意这个决定,但是这里有一个关于从pip 10中移除该模块的PR。 https://github.com/pypa/pip/pull/4700 - Matt
6个回答

157

最近这种情况是由于pip 10的更改所致。

修复方法非常容易。你可能有以下类似的内容:

from pip.req import parse_requirements

将其更改为类似于以下内容:

try: # for pip >= 10
    from pip._internal.req import parse_requirements
except ImportError: # for pip <= 9.0.3
    from pip.req import parse_requirements

那应该就可以了。

9
为什么他们没有添加向后兼容性。许多软件包安装时会出现此错误。 :( - Niklas R
1
似乎他们后悔这个功能是公开的,因为他们将其移动到了“_internals”的私有命名空间中。但是,确实不好把它拿走。 - mlissner
@kororo,我认为你将日期读成了“2016年4月”,而不是今年的“4月16日”。 - mlissner
pip开发者从未打算销售API,而只是作为一个工具。 - uchuugaka
1
由于人手极少,他们没有太多时间和精力来制定一个惊人的过渡计划。令我震惊的是,庞大的Python社区对pip开发人员微不足道的贡献。 - uchuugaka
谢谢,这非常有用 =D - cesargroening

55

我将pip降级至9.0.3,这对我很有用。 降级pip的命令是

python -m pip install pip==9.0.3

谢谢。很遗憾不得不降级pip,但这是我唯一可行的方法。 - userABC123

35

看起来,如果您有以下代码,它应该可以工作:

def parse_requirements(filename):
    """ load requirements from a pip requirements file """
    lineiter = (line.strip() for line in open(filename))
    return [line for line in lineiter if line and not line.startswith("#")]

请执行以下步骤:

  1. 创建一个名为 pip/ 的目录。
  2. 在该目录下创建一个空文件,文件名为 __init__.py
  3. 在该目录下创建一个名为 req.py 的文件。
  4. 将上述代码复制到 pip/req.py 文件中。
  5. 修改 setup.py 文件中的一行代码:

    install_reqs 修改为 reqs


2
谢谢!所以我能理解 - 为什么呢?为什么我必须自己添加这段代码,上面的代码又是做什么用的? - user3796109
3
tweepy的作者编写了一个setup.py脚本,引用了不存在的文件和目录。我将告诉你作者可能的意图。(很可能这些文件在作者的硬盘上但未添加到git存储库中。这种情况时有发生。)此代码会读取pip requirements.txt文件,并提取要安装的模块。然后setup.py实际上会安装这些文件。 - hughdbrown
@hughdbrown 我应该修改哪一行代码?修改成什么? - Alex
1
@AliIssa 我建议将该函数放置在setup.py文件中,而不是导入它。请参见下面的解决方案。 - Matthew Frost
嗨@hughdbrown,你能告诉我你谈论的setup.py文件的位置吗?我对Django/Python真的很陌生。 - Anish
1
并不是很清楚在setup.py文件中应该在哪里添加reqs=install_reqs这一行,所以我还是卡在同一个问题上。 - Landmaster

12

我遇到了一个与Python 3.7 + pip 18.0非常相似的问题:

Traceback (most recent call last):
  File "/usr/local/bin/pip-compile", line 7, in <module>
    from piptools.scripts.compile import cli
  File "/usr/local/lib/python3.7/site-packages/piptools/scripts/compile.py", line 11, in <module>
    from pip.req import InstallRequirement, parse_requirements
ModuleNotFoundError: No module named 'pip.req'

解决方案是将pip-tools从1.10升级到2.0版本:
pip install -U pip-tools

今天我也遇到了pip-tools的同样问题(alô Humberto!) - Elias Dorneles
4
from pip._internal.req import parse_requirements 可以翻译为:从pip._internal.req模块导入parse_requirements函数。 - Logovskii Dmitrii

9

不要导入该函数,以免遇到更多问题,将setup.py文件的内容替换为以下内容:

#!/usr/bin/env python
#from distutils.core import setup
import re, uuid
from setuptools import setup, find_packages

def parse_requirements(filename):
    """ load requirements from a pip requirements file """
    lineiter = (line.strip() for line in open(filename))
    return [line for line in lineiter if line and not line.startswith("#")]


VERSIONFILE = "tweepy/__init__.py"
ver_file = open(VERSIONFILE, "rt").read()
VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]"
mo = re.search(VSRE, ver_file, re.M)

if mo:
    version = mo.group(1)
else:
    raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,))

install_reqs = parse_requirements('requirements.txt')
reqs = install_reqs

setup(name="tweepy",
      version=version,
      description="Twitter library for python",
      license="MIT",
      author="Joshua Roesslein",
      author_email="tweepy@googlegroups.com",
      url="http://github.com/tweepy/tweepy",
      packages=find_packages(exclude=['tests']),
      install_requires=reqs,
      keywords="twitter library",
      classifiers=[
          'Development Status :: 4 - Beta',
          'Topic :: Software Development :: Libraries',
          'License :: OSI Approved :: MIT License',
          'Operating System :: OS Independent',
          'Programming Language :: Python',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.6',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.3',
          'Programming Language :: Python :: 3.4',
      ],
      zip_safe=True)

请注意,从parse_requirements调用中已经移除了session参数。


3

我遇到了你所遇到的问题。为了安装pip,你需要按照以下步骤进行 https://pypi.python.org/pypi/setuptools。一旦你得到了easy_install,我首先安装了pip,然后运行了以下命令。

sudo easy_install pip
sudo python setup.py install

容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接