Python venv ModuleNotFoundError

Python venv ModuleNotFoundError

(在给我重复的问题投票之前,请注意我在这个问题上能找到的所有内容都与 virtualenv 有关,而不是 venv)

系统:

背景 (人为的例子,所以可能会有一两个错别字,但想法是重要的部分)

我有以下形式的项目:

Project/
├── __init__.py
└── project
    ├── packageA
    │   ├── fileA.py
    │   └── __init__.py
    └── packageB
        ├── fileB.py
        └── __init__.py

在fileb.py中,我有一个导入语句,例如

import project.packageA.fileA

我创建了一个 venv;

cd /path/to/Project; python3.6 -m venv .venv; source .venv/bin/activate

那我运行

source project/packageB/fileB.py

这会给我一个错误:

ModuleNotFoundError: no module named 'project'

尝试地址

  1. 将路径添加到 "Project" 并将 "project" 添加到 $PATH
  2. 修改 .venv/bin/activate 脚本中的 $PYTHONPATH,使 sys.path 现在指向 "Project" 和 "project"
  3. 完整阅读文档here
  4. 已验证 os.sys.path 显示项目和项目路径

问题:使用 venv 进行模块导入必须是 possible 否则它将是零值——那么我在我的基础上缺少什么设置? (对于viritualenv,我只用了'add2virtualenv')

[编辑 - 显示更多细节]

# Changes to .venv/bin/activate
PYTHONPATH="/home/steve/Temp/Project:/home/steve/Temp/Project/project:$PYTHONPATH"
export PYTHONPATH

python -c "import os; print(os.sys.path)"
['', '/home/steve/Temp/Project', '/home/steve/Temp/Project/project', .....

[Edit2 - 将 packageA 添加到 PYTHONPATH Works]

如果我将 'path/to/packageA' 添加到我的 PYTHONPATH,导入工作。要使用它,我必须将每个子包添加到我的项目中——对于大型项目来说不太理想。

恕我直言,情况有点模糊。我的解决方案是:为您的项目创建一个 setup.py(无论如何都是有益的),并在激活的 venv 下执行 "python setup.py develop".

这会将您的项目添加到 PTH 文件中,因此您可以导入。

setup.py 的示例,取自互联网:

# from http://python-packaging.readthedocs.io/en/latest/minimal.html

from setuptools import setup

setup(name='funniest',
      version='0.1',
      description='The funniest joke in the world',
      url='http://github.com/storborg/funniest',
      author='Flying Circus',
      author_email='flyingcircus@example.com',
      license='MIT',
      packages=['funniest'],
      zip_safe=False)

这一行

​$ source project/packageB/fileB.py

失败因为

  1. import 路径搞砸了,它包括 project 文件夹,但它不应该
  2. project 可能 不在您的 PYTHONPATH

修复它

步骤 1) 修复 fileB.py 中的 import 语句,将 import 替换为

​import packageA.fileA

步骤 2) 通过检查您的 bash 环境

自己确认是否将 project 添加到 PYTHONPATH
​$ echo $PYTHONPATH     # does it contain `path/to/project`?

如果不行暂时修复

​$ export PYTHONPATH=path/to/project:$PYTHONPATH   # forget `/path/to/Project` you only need `path/to/Project/project`

(注意对 $PATH 的更改与 Python package/module 搜索无关,因此这是一次无用的尝试)。

然后当你运行你的脚本时,它不会失败:

$ source project/packageB/fileB.py      # success?!

顺便说一句,最好用 python:

调用你的 python 脚本
$ python project/packageB/fileB.py

最后,通过编辑虚拟环境 bin 目录中的 activate 脚本永久更新您的虚拟环境。在靠近顶部的某处添加 PYTHONPATH 导出。