【问题标题】:Python Pip Local DownloadPython Pip 本地下载
【发布时间】:2020-07-19 18:11:00
【问题描述】:

所以我希望为我的项目在本地下载 Flask(和所有其他依赖项)。我使用以下代码执行此操作:

pip install -t lib Flask

这可以正常工作和执行。结果保存在lib 目录中。但是,当尝试从lib.Flask 导入 Flask 时,会出现此错误:

ModuleNotFoundError: No module named 'jinja2'

我知道 Flask 依赖于这个库,但它是使用上述命令与 Flask 一起安装的。换句话说,jinja2lib 目录中。

为什么会出现此错误?我该如何解决?

【问题讨论】:

  • 所以你解决了你的问题,还是?

标签: python pip


【解决方案1】:

当你在 python 中导入一个模块时,python 做的第一件事是在你的直接目录中查找它,如果在那里找不到它,它会在 python 的全局 lib 安装路径中搜索它,如果在那里也没有找到它它会引发错误

在python中还有一个叫做相对和全局导入的东西,我很确定Flask同时使用两者(在模块内部是相对的,对于外部依赖是全局的)

为了让您本地存储的Flask 正常工作,您要么需要让 python 认为它是它的全局模块索引的一部分,要么进入 Flask 并手动修复所有全局导入到相对其外部依赖项

编辑:

例如你有一个 lib 文件夹:

lib/
  foo/   # module
  bar/   # module
  spam/  # module

让 python 将它们视为其全局(用户/系统范围)模块索引的一部分的最懒惰的方法是将它们中的每一个添加到 PATH

在本例中,您对 PATH 的添加将如下所示:

full/path/to/lib/foo

让 python 将 foo 视为来自此 lib 文件夹的模块

如果你想让python也识别barspam,你需要以相同的方式添加它们

EDIT2:懒惰的方式第 2 部分

假设您有一些具有依赖关系的模块,它们都在某个文件夹中:

lib/
  lol/   # module, its just here
  foo/   # module, bar needs this
  bar/   # module, spam needs this
  spam/  # module, you only need this

再次让python看到lib作为其全局(用户/系统范围)模块索引的一部分的最懒惰的方法是将lib文件夹添加到PATH

你可以从 python 本身这样做:

>>> import sys
>>> sys.path.append('/full/path/to/your/lib')
>>> import spam # now this will work, any other module from lib/ will work too

【讨论】:

  • 我如何让 python 认为它是它的全局模块索引的一部分?
  • 另一种将模块添加到python全局(用户/系统范围)模块索引的方法是使用Site-specific configuration hook
  • 这也可能直接为您提供解决方案Configuring Python to use additional locations for site-packages
  • 所以如果我无法访问 PATH,因为我在无服务器实例上运行它,我应该使用 site-packages 方法吗?
  • 我认为您可以在 python 中使用sys.path 修改 PATH,更改不会是永久性的,但它会起作用(我在无服务器 Windows 机器上测试过,Linux 也可以)
【解决方案2】:

Flask 依赖于 jinja2 模块,安装它:

python -m pip install jinja2

python3 -m pip install jinja2

取决于python版本将为您解决问题。

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 2017-11-13
    • 2017-12-02
    • 2020-06-11
    • 1970-01-01
    • 2022-06-17
    • 2021-10-31
    • 2017-07-18
    相关资源
    最近更新 更多